我对 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
检查过,所有内容都按预期呈现...
本质上,唯一的区别是 post
和 post_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/