gpt4 book ai didi

ruby-on-rails - 重定向后闪现消息的功能测试

转载 作者:行者123 更新时间:2023-11-28 19:46:11 25 4
gpt4 key购买 nike

我不确定如何通过功能测试检查 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

当我在浏览器中手动测试它时,它的行为符合预期,但我不确定如何编写测试来反射(reflect)这一点。前两个断言通过了(因此测试识别出它被正确重定向,并且 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 呈现正确的 View 。如果我在 assert_select 语句之前添加一个 get 语句,测试通过,因为现在 @response.body 有 flash div。然而,这似乎不是一个有效的测试,因为它没有反射(reflect)我的应用程序的行为——用户不必发出新的请求来查看 flash 消息。

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

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

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

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

最佳答案

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

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

  2. 测试元素是否显示在页面上 - View 规范不属于 Controller 。以下是对 Controller 角色的描述:

    A controller can thus be thought of as a middle man between models and views. It makes the model data available to the view so it can display that data to the user.

    Controller 应该为 View 提供数据,而不是指定如何呈现数据。想象一下,如果您更改了 CSS 类的名称,那么您还必须更新 Controller 规范。

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

关于ruby-on-rails - 重定向后闪现消息的功能测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13895584/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com