我不确定如何通过功能测试检查闪存消息。我的问题与我的测试有关,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.
所以我尝试在语句puts @response.body
之前添加,它打印了这个:assert_select
<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
这解释了为什么它找不到 flash div,但我不确定如何“完成”重定向,以便它使用 flash div 呈现正确的视图。如果我在get
语句之前添加一个语句assert_select
,则测试通过,因为现在@response.body
有 flash div。然而,这似乎不是一个有效的测试,因为它没有反映我的应用程序的行为——用户不必提出新的请求来查看 Flash 消息。
它也不保证 Flash 消息显示在正确的页面上。如果我使用 statement get :new
,断言仍然通过,这意味着 flash 消息将出现在users#new
视图上。即使我使用
get :show, id: assigns(:user).id
为了确保 Flash 消息显示在正确的页面上,这仍然感觉不对,因为 1)现在它是success
响应而不是redirect
响应,并且 2)它仍然没有解释为什么我必须手动请求任何页面来查找flash div - 根据文档,“flash 是会话的特殊部分,每个请求都会清除它。 ”
无论如何,有没有办法测试重定向后闪烁消息是否正确显示?