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