我是使用rspec的新手,所以希望我能正确解释这一点。我想确保创建了我的对象,然后确保创建了一个has_one
关系的相关对象。
因此,我的代码在模型中看起来像这样:
class Device < ActiveRecord::Base
has_one :scan_option
validates_presence_of :name
after_create :create_scan_option
def create_scan_option
self.scan_option.create!
end
end
我有一个设备工厂:
FactoryGirl.define do
serial_number = SecureRandom.uuid.delete("-")
factory :device do
identifier serial_number
name "Device 1"
is_registered true
timezone "America/Chicago"
end
end
在我的rspec模型测试中,我想代码看起来像这样:
RSpec.describe Device, :type => :model do
it "creates a scan_option after_create" do
subject = build(:device)
# test whether the scan_option object was created and associated with the device?
end
end
我没有使用shoulda
或其他任何东西,只是想更好地理解Rspec。
答案 0 :(得分:2)
我会做这样的事情:
subject(:device) { Device.create(attributes_for(:device)) }
it 'has a scan option' do
expect(device.scan_option).to be_present
end
我会使用Device.create
而不是FactoryGirl.create
来确保类本身创建关联对象,而不是由工厂创建。
答案 1 :(得分:0)
您应该只能保存设备然后调用关联并检查它返回
it "creates a scan_option after_create" do
subject = build(:device)
subject.save
expect(subject.scan_option).to be
end
答案 2 :(得分:0)
几种方式:
subject = build(:device)
expect(subject.scan_option).not_to be_nil
expect { build(:device) }.to change(ScanOption, :count).by(1)
它可能不会通过,因为你只建造了你的工厂。
为了执行回调,您实际上必须将其保留在数据库中:
subject = create(:device)