ruby-on-rails - Rails 4 中的 Post 与 Post_via_redirect 未按预期方式运行

标签 ruby-on-rails ruby-on-rails-4 railstutorial.org

我对 M. Hartl 的 Rails 指南(第 8 章)中集成的特定部分感到困惑 测试。我正在尝试验证用户登录/注销,这是我的测试代码(不起作用):

##doesnt work
test "should display user logout behavior" do
  get login_path
  assert_template 'sessions/new'
  assert_select "a[href=?]", signup_path, count: 3
  assert_select "a[href=?]", login_path, count: 2
  post_via_redirect login_path, session: {email: @user.email, 
    password: "password"}
  assert_redirected_to @user
  assert logged_in?
  assert_select "a[href=?]", signup_path, count: 0
  assert_select "a[href=?]", login_path, count: 0
  delete logout_path
  follow_redirect!
  assert_template 'static_pages/home'
  assert_not logged_in?
  assert_select "a[href=?]", login_path, count: 2
  assert_select "a[href=?]", signup_path, count: 3
end

但是,进行这些修改将使其正常工作:

#works
test "should display user logout behavior" do
  get login_path
  assert_template 'sessions/new'
  assert_select "a[href=?]", signup_path, count: 3
  assert_select "a[href=?]", login_path, count: 2
  post login_path, session: {email: @user.email, 
    password: "password"}
  assert_redirected_to @user
  follow_redirect!
  assert logged_in?
  assert_select "a[href=?]", signup_path, count: 0
  assert_select "a[href=?]", login_path, count: 0
  delete logout_path
  follow_redirect!
  assert_template 'static_pages/home'
  assert_not logged_in?
  assert_select "a[href=?]", login_path, count: 2
  assert_select "a[href=?]", signup_path, count: 3
end

失败的部分是 assert_redirected_to。我已经通过 response.body 检查过,所有内容都按预期呈现...

本质上,唯一的区别是 postpost_via_redirect。 看看“via_redirect”的 source code,我相信它们应该像它们一样工作 我们正在做的是跟随重定向,直到没有剩下的。此外,除了我正在测试的重定向之外,我没有其他重定向:

def create
    user = User.find_by email: params[:session][:email]
    if user && user.authenticate(params[:session][:password].downcase)
      log_in(user)
      redirect_to user_path(user.id)
    else
      flash.now[:danger] = "Invalid username/password combination"
      render 'new'  
    end
  end

  def destroy
    reset_session
    redirect_to root_path
  end

从这个角度来看,问题如下:

  • 每当我们调用 via_redirect 时,重定向选项是否会丢失,从而进行测试 “assert_redirected_to @user”失败?

  • 运行 via_redirect 时是否还要进行一次跳转?我所看到的 follow_redirect! 所做的就是运行 get(response.location)

非常感谢!

最佳答案

我想问题就在

之内
 assert_redirected_to @user

这个断言只是检查前一个操作的响应头,这很好。但是,如果您遵循重定向,则先前的重定向响应已经消失,并且您会在重定向后收到响应。

由于这是一个集成测试,因此无需检查每一步。因为如果重定向失败下一个断言

断言已登录?

也会失败。

因此,如果使用 post_via_redirect 只需检查适用于下一页的内容。

关于ruby-on-rails - Rails 4 中的 Post 与 Post_via_redirect 未按预期方式运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27506324/

相关文章:

ruby-on-rails - 在 gem rails 上充当可标记功能不起作用

ruby-on-rails - Ruby Rails Hartl 教程 Ch. 8.2.6 测试失败

ruby-on-rails - 在 Ruby on Rails 教程第 8 章中,我收到 "Failure/Error: fill_in "密码",其中:user.password Capybara::ElementNotFound:"

ruby-on-rails - Rails 4.x 和 app/controllers/concerns 中的子文件夹

ruby-on-rails - 具有 100% 宽度的 rails css 罗盘网格?

ruby-on-rails - 在 Rails I18n 中本地化日期时间

javascript - 使用 firebug 在 firefox 中调试 coffeescript

ruby-on-rails - 如何从 Rails 4.2.7.1 升级到 Rails 5.0.0.1?

session - 在 Rails 中,当浏览器关闭时如何销毁 session ?

ruby-on-rails - Rails 找不到 gem