【发布时间】:2023-03-28 20:25:01
【问题描述】:
我刚刚找到了一些测试不断失败的原因,但我修复它的方式似乎并不正确。我想知道这是否可以改进。
我有一个控制器动作,索引,看起来像这样。
class StuffController < ApplicationController
before_action :signed_in_user
def index
@stuff = current_user.stuff
end
end
signed_in_user 方法,直接来自教程:
def signed_in_user
unless signed_in?
store_location
redirect_to signin_url, notice: "Please sign in."
end
end
当我测试未登录就访问 /stuff 端点的情况时,测试失败,因为:
Failure/Error: get "/stuff"
NoMethodError:
undefined method `stuff' for nil:NilClass
我现在知道这是因为,尽管 before_action 导致响应重定向到 signin_url,但 index 操作仍然完整执行。我将操作更改为此以修复它:
def index
@stuff = current_user.stuff unless current_user.nil?
end
似乎应该有一种方法可以强制重定向停止执行其余代码,而不是通过两次检查 current_user.nil? 来弄脏每个操作。我确实尝试添加redirect_to signin_url, notice: "Please sign in." and return,但没有奏效。
这是正确/有轨的方式,还是可以改进?
【问题讨论】:
标签: ruby-on-rails rspec rspec-rails