Ruby on rails 重定向后闪存消息的功能测试
我不知道如何通过功能测试检查flash消息。我的问题与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[: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