构建另一个模型的RSPEC隔离测试



我有以下导轨模型:

class Factory < ApplicationRecord
  has_many :widget
  def build_widget!
    widget = widgets.build
    widget.verify!  # does stuff, could raise exception depending outcome of third party api calls, etc.
    widget.save!
  end   
end

我有以下RSPEC测试设置:

RSpec.describe Factory, type: :model do
  describe '#build_widget!' do
  let(:factory) { create(:factory) }
  it 'creates a new widget' do
    expect(factory.widgets.count).to eq 0
    factory.build_new_widget!
    expect(factory.widgets.count).to eq 1
  end
end

我正在努力的一些问题:

1)如何隔离工厂测试,因此我不依赖widefify的结果!(我已在小部件模型的单独规格下介绍)。因为该方法在方法内部进行了硬编码,所以我正在为如何设置适当的模拟或双重设计而苦苦挣扎。

2)测试工厂。这似乎有点黑,但我不确定如何正确设置期望。

1)您可以在期望之前使用RSPEC模拟:

before(:each) do
  allow_any_instance_of(Widget).to receive(:verify!).and_return(true)
end

2)最好跟踪对象中的更改:

RSpec.describe Factory, type: :model do
  describe '#build_widget!' do
    before(:each) do
      allow_any_instance_of(Widget).to receive(:verify!).and_return(true)
    end
    let(:factory) { create(:factory) }
    it 'creates a new widget' do
      expect do
        factory.build_widget!
      end.to change { factory.widgets.count }.from(0).to(1)
    end
  end
end

最新更新