7

我不确定如何通过功能测试检查闪存消息。我的问题与我的测试有关,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 是会话的特殊部分,每个请求都会清除它。

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

4

1 回答 1

3

我正在从 POV 回答这个问题,即您尝试测试的内容将在其他地方进行更好的测试。如果您在设置测试时遇到很多麻烦,那么很有可能有更好的方法来测试它:)

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

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

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

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

    如果您真的想测试显示的 Flash 消息,我会使用集成测试。

于 2012-12-16T01:52:55.863 回答