Ruby on rails 重定向后闪存消息的功能测试

Ruby on rails 重定向后闪存消息的功能测试,ruby-on-rails,testing,redirect,functional-testing,Ruby On Rails,Testing,Redirect,Functional Testing,我不知道如何通过功能测试检查flash消息。我的问题与重定向到有关,因为我的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 '

我不知道如何通过功能测试检查flash消息。我的问题与
重定向到
有关,因为我的
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]
被设置为
“欢迎!”
)。基于此,我认为
assert\u select
语句将能够找到div,但如果失败并显示此错误消息:

Expected at least 1 element matching "div.alert-success", found 0.
因此,我尝试在
assert\u select
语句之前添加
put@response.body
,该语句打印了以下内容:

<html><body>You are being <a href="http://test.host/users/3">redirected</a>.</body></html>
为了确保flash消息显示在正确的页面上,这仍然感觉不正确,因为1)现在它是
成功
响应,而不是
重定向
响应,2)它仍然没有解释为什么我必须手动请求任何页面来查找flash div-根据,“闪存是会话的一个特殊部分,每次请求都会清除它。”


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

我从POV回答这个问题,你要测试的内容最好在别处测试。如果你在设置测试时遇到很多问题,很可能有更好的方法来测试:)

  • 测试flash消息是否被清除——flash消息内置在Rails中,因此测试框架正在为您处理的东西没有多大意义

  • 测试页面上显示的元素-视图规格不属于控制器。以下是控制器角色的说明:

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

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

    如果您真的想测试flash消息是否显示,我将使用集成测试


  • 我也有同样的问题。我发现,当我从get调用的操作重定向时,它似乎起作用,即assert_select可以访问重定向视图,但当我从“post”调用的操作重定向时,它只会看到“You is redirected…”页面。非常烦人。我尝试使用follow_redirect!但这在Function中不可用我在做测试。
    get :show, id: assigns(:user).id