测试rspec

时间:2017-01-26 16:07:12

标签: ruby-on-rails ruby rspec

我是使用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。

3 个答案:

答案 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)