重定向后对Flash消息的功能测试

ben*_*vor 7 testing redirect ruby-on-rails functional-testing

我不确定如何通过功能测试检查flash消息.我的问题与redirect_to我的flash[:error]DOES 测试通过有关.这是我的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
Run Code Online (Sandbox Code Playgroud)

我有一个通过测试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
Run Code Online (Sandbox Code Playgroud)

当我在浏览器中手动测试它时,它的行为符合预期,但我不知道如何编写测试来反映这一点.前两个断言正在传递(因此测试识别它正在被重定向,并且flash[:success]被设置为"Welcome!").基于此,我认为该assert_select语句将能够找到div,但如果失败并显示以下错误消息:

Expected at least 1 element matching "div.alert-success", found 0.
Run Code Online (Sandbox Code Playgroud)

所以我puts @response.bodyassert_select声明之前尝试添加,这打印了这个:

<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
Run Code Online (Sandbox Code Playgroud)

这解释了为什么它找不到flash div,但我不确定如何"完成"重定向,以便使用flash div渲染正确的视图.如果我在get语句之前添加一个语句assert_select,则测试通过,因为现在@response.body有flash div.但是,这似乎不是一个有效的测试,因为它不反映我的应用程序的行为 - 用户不必发出新的请求来查看Flash消息.

它也不保证闪存消息显示在正确的页面上.如果我使用该语句get :new,断言仍然会通过,这意味着flash消息将出现在users#new视图中.即使我使用

get :show, id: assigns(:user).id  
Run Code Online (Sandbox Code Playgroud)

为了确保flash信息显示在正确的页面上,这仍然感觉不对,因为1)现在它是success响应而不是redirect响应,2)它仍然无法解释为什么我必须手动请求任何页面才能找到flash div - 根据文档,"flash是会话的一个特殊部分,每次请求都会清除. "

无论如何,有没有办法测试重定向后flash消息是否正确显示?

Fio*_*a T 3

我从 POV 的角度回答这个问题,即您要测试的内容在其他地方会得到更好的测试。如果您在设置测试时遇到很多麻烦,很可能有更好的方法来测试它:)

  1. 测试 flash 消息是否被清除 - flash 消息内置于 Rails 中,因此测试框架为您处理的内容没有多大意义。

  2. 测试页面上显示的元素 - 视图规范不属于控制器。以下是控制器角色的描述:

    因此,控制器可以被认为是模型和视图之间的中间人。它使模型数据可用于视图,以便它可以向用户显示该数据。

    控制器应该使数据可供视图使用,而不是指定如何呈现数据。想象一下,如果您更改了 CSS 类的名称,那么您还必须更新控制器规范。

    如果您确实想测试闪现消息是否显示,我会使用集成测试。