我不确定如何通过功能测试检查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[: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信息显示在正确的页面上。如果我使用语句get :new
,断言仍然会通过,这意味着flash消息将出现在users#new
视图中。即使我使用
get :show, id: assigns(:user).id
要确保Flash信息显示在正确的页面上,这仍然是错误的,因为1)现在它是success
响应而不是redirect
响应,2)它仍然没有解释为什么我必须手动请求任何页面来查找flash div - 根据docs,“flash是会话的一个特殊部分,清除每个请求。”
无论如何,有没有办法测试重定向后flash消息是否正确显示?
答案 0 :(得分:3)
我正在回答POV的这个问题,你试图测试的内容会在其他地方得到更好的测试。如果您在设置测试时遇到很多麻烦,可能有更好的方法来测试它:)
测试闪存消息是否被清除 - 闪存消息内置于Rails中,因此测试框架正在为您处理的内容没有多大意义。
测试页面上显示的元素 - 视图规格不属于控制器。以下是控制器角色的描述:
因此,控制器可以被认为是模型和模型之间的中间人 观点。它使模型数据可供视图使用,以便显示 该数据给用户。
控制器应该使视图可用数据,而不是指定数据的呈现方式。想象一下,如果您更改了CSS类的名称,那么您还必须更新控制器规格。
如果您真的想测试闪存消息是否显示,我会使用集成测试。