RSpec:避免使用允许任何实例接收

Mar*_*a N 6 ruby rspec ruby-on-rails rubocop rubocop-rspec

我正在处理旧的代码部分。

before do
  allow_any_instance_of(SportRateManager)
    .to receive(:create)
    .and_return(true)
end
Run Code Online (Sandbox Code Playgroud)

有Rubocop错误,例如:

避免使用'allow_any_instance_of'进行存根

我读到有关RuboCop :: RSpec:AnyInstance的内容,并试图像下面这样更改它。

由此

before do
  allow_any_instance_of(SportRateManager)
    .to receive(:create)
    .and_return(true)
end
Run Code Online (Sandbox Code Playgroud)

对此:

let(:sport_manager) { instance_double(SportRateManager) }

before do
  allow(SportRateManager).to receive(:new).and_return(sport_manager)
  allow(sport_manager).to receive(:create).and_return(true)
end
Run Code Online (Sandbox Code Playgroud)

并具有完整的上下文:-之前

describe 'POST create' do
    let(:sport_rate) { build(:sport_rate) }
    let(:action) { post :create, sport_rate: sport_rate.attributes }

    context 'when sport rate manager created the rate successfully' do
      before do
        allow_any_instance_of(SportRateManager)
          .to receive(:create)
          .and_return(true)
      end

      it 'returns ok status' do
        action
        expect(response).to have_http_status(:ok)
      end
    end
Run Code Online (Sandbox Code Playgroud)

...-之后:

describe 'POST create' do
    let(:sport_rate) { build(:sport_rate) }
    let(:action) { post :create, sport_rate: sport_rate.attributes }
    let(:sport_manager) { instance_double(SportRateManager) }

    context 'when sport rate manager created the sport successfully' do
      before do
        allow(SportRateManager).to receive(:new).and_return(sport_manager)
        allow(sport_manager).to receive(:create).and_return(true)
      end

      it 'returns ok status' do
        action
        expect(response).to have_http_status(:ok)
      end
    end
Run Code Online (Sandbox Code Playgroud)

但这不会通过测试并显示错误:

#<InstanceDouble(SportRateManager) (anonymous)> received unexpected message :sport_rate with (no args)

eud*_*nia 10

解决方案差不多完成了。您可能需要build :sport_rate在创建之前添加

像那样

let(:sport_manager) { instance_double(SportRateManager) }

before do
  allow(SportRateManager).to receive(:new).and_return(sport_manager)
  allow(sport_manager).to receive(:sport_rate).and_return(build :sport_rate)
  allow(sport_manager).to receive(:create).and_return(true)
end
Run Code Online (Sandbox Code Playgroud)