在重定向后对闪存消息进行功能测试

我不知道如何检查功能测试的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消息,我会使用集成测试。

  • 链接地址: http://www.djcxy.com/p/11613.html

    上一篇: Functional tests for flash messages after redirect

    下一篇: A BIG bug of VC++? Why does initializer