Rspec隔离测试用于构建另一个的模型

时间:2017-03-07 15:45:52

标签: ruby-on-rails rspec

我有以下Rails模型:

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)如何隔离Factory测试,因此我不依赖于widget.verify的结果! (我在Widget模型的单独规范中介绍过)。因为这个方法在方法中是硬编码的,所以我正在努力设置一个正确的模拟或双重。

2)测试factory.widgets.count是最好的方法吗?这看起来有些过时,但我不确定如何正确设定期望。

1 个答案:

答案 0 :(得分:0)

1)您可以在期望之前使用RSpec Mocks

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