【问题标题】:Functional tests for flash messages after redirect重定向后闪存消息的功能测试
【发布时间】:2012-12-15 19:47:07
【问题描述】:

我不确定如何通过功能测试检查 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) 检查页面中的 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.

所以我尝试在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 视图上。即使我使用

get :show, id: assigns(:user).id  

为了确保 flash 消息显示在正确的页面上,这仍然感觉不对,因为 1) 现在它是 success 响应而不是 redirect 响应,并且 2) 它仍然没有解释为什么我必须手动请求任何页面才能找到 flash div - 根据docs,“flash 是会话的特殊部分,每个请求都会清除。

无论如何,有没有一种方法可以测试重定向后 Flash 消息是否正确显示?

【问题讨论】:

  • 我也有同样的问题。我发现,当我从 get 调用的操作重定向时,它似乎可以工作,即 assert_select 可以访问重定向的视图,但是当我从“post”调用的操作重定向时,它只会看到“您正在被重定向......”页。很烦人。我尝试使用follow_redirect!但这在功能测试中不可用。

标签: ruby-on-rails testing redirect functional-testing


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-02
    • 2014-09-15
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2011-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多