【发布时间】:2012-12-15 19:47:07
【问题描述】:
我不确定如何通过功能测试检查 Flash 消息。我的问题与redirect_to 有关,因为我对flash[:error] 的测试确实通过了。这是我的create 操作的样子:
def create
@user = User.new(params[:user])
if @user.save
redirect_to @user, flash: { success: "Welcome!" }
else
flash.now[:error] = "Signup failed:"
render 'new'
end
end
我对 flash[:error] 进行了通过测试,即 1) 检查 flash[:error] 的值是否正确,2) 检查页面中的 flash div,以及 3) 获取新页面并检查 flash 消息是否已清除。我试图对flash[:success] 进行类似的测试,但是当它试图在页面上找到 div 时它失败了。这是失败的测试:
should "show flash[:success] message" do
post :create, user: { name: "valid user",
password: "userpw",
password_confirmation: "userpw",
email: "a@b.com" }
assert_redirected_to user_path(assigns(:user)), "user isn't being redirected to their page after registration"
assert_equal flash[:success], "Welcome!", "flash[:success] isn't being set properly"
assert_select "div.alert-success", flash[:success]
get :new
assert flash.empty?, "there shouldn't be any flash messages left after getting new page"
end
当我在浏览器中手动测试它时,它的行为符合预期,但我不确定如何编写测试来反映这一点。前两个断言通过(因此测试识别出它被正确重定向,并且flash[:success] 被设置为"Welcome!")。基于此,我认为assert_select 语句将能够找到 div,但如果失败并显示此错误消息:
Expected at least 1 element matching "div.alert-success", found 0.
所以我尝试在assert_select 语句之前添加puts @response.body,它打印了这个:
<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
这解释了为什么它找不到 flash div,但我不确定如何“完成”重定向,以便它使用 flash div 呈现正确的视图。如果我在assert_select 语句之前添加get 语句,则测试通过,因为现在@response.body 具有flash div。然而,这似乎不是一个有效的测试,因为它没有反映我的应用程序的行为——用户不必提出新的请求来查看 Flash 消息。
它也不保证 Flash 消息显示在正确的页面上。如果我使用语句get :new,断言仍然通过,这意味着flash 消息将出现在users#new 视图上。即使我使用
get :show, id: assigns(:user).id
为了确保 flash 消息显示在正确的页面上,这仍然感觉不对,因为 1) 现在它是 success 响应而不是 redirect 响应,并且 2) 它仍然没有解释为什么我必须手动请求任何页面才能找到 flash div - 根据docs,“flash 是会话的特殊部分,每个请求都会清除。”
无论如何,有没有一种方法可以测试重定向后 Flash 消息是否正确显示?
【问题讨论】:
-
我也有同样的问题。我发现,当我从 get 调用的操作重定向时,它似乎可以工作,即 assert_select 可以访问重定向的视图,但是当我从“post”调用的操作重定向时,它只会看到“您正在被重定向......”页。很烦人。我尝试使用follow_redirect!但这在功能测试中不可用。
标签: ruby-on-rails testing redirect functional-testing