【问题标题】:Rspec tests with before_action and current_user (as in Hartl tutorial)使用 before_action 和 current_user 进行 Rspec 测试(如在 Hartl 教程中)
【发布时间】: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


    【解决方案1】:

    我的测试失败的原因是我在使用教程中的帮助函数登录时忘记添加no_capybara: true 选项。由于这是一个请求规范,capybara DSL 不会自动可用。正确的/rails 答案是:

    it "does something when logged in" do
      before { sign_in @user, no_capybara: true }
      expect(stuff).to be_stuff
    do
    

    sign_in 辅助方法显示为here

    【讨论】:

      猜你喜欢
      • 2012-06-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多