如何在 Rspec 中跳过 before_create 回调

aws*_*sid 1 rspec ruby-on-rails callback

嗨,我正在使用带有 ruby​​-2.2.5 和 rails 5 的 Rails 应用程序,我正在使用 rspec 来测试我的控制器。用户模型中有一个回调,before_create :create_token我想在 rspec 中跳过这个回调。

spec/controllers/check_token_controller_spec.rb

# frozen_string_literal: true

require 'rails_helper'

describe CheckTokenController do
  before do
    @user = User.create!(fullname: 'saddam husain',
                         email: 'saddam@gmail.com',
                         password: 'pass',
                         password_confirmation: 'pass',token: 'xyz')
  end

  describe 'POST create' do 
    subject { post :create, params: params }

    context 'when credentials are valid' do
      let(:params) do
        { data: { attributes: { username: 'saddam@gmail.com', token: 'xyz' } } }
      end

      it { is_expected.to have_http_status(200) }
    end

    context 'when credentials are invalid' do
      let(:params) do
        { data: { attributes: { username: 'saddam@gmail.com', token: '' } } }
      end

      it { is_expected.to have_http_status(401) }
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

我想跳过 create_token 回调。请帮我如何跳过。

dan*_*isr 5

一个快速的解决方案是使用RSpec#allow_any_instance_of方法create_token为所有类存根。

before do
  allow_any_instance_of(User).to receive(:create_token)
  @user = User.create!(fullname: 'saddam husain', email: 'saddam@gmail.com', ...)
end
Run Code Online (Sandbox Code Playgroud)

不推荐这样做(参考;请阅读完整部分),您可能需要跳过第三方代码或服务集成create_token方法。所以你应该模拟这个服务而不是create_token方法。以下是有关如何执行此操作的示例:https : //stackoverflow.com/a/19281316/1042324

让我们知道您的create_token方法的内容,以便我们更好地帮助您。