2017-01-26 3 views
0

Ich bin neu bei der Verwendung von rspec, also werde ich das hoffentlich richtig erklären. Ich möchte sicherstellen, dass mein Objekt erstellt wird und anschließend sicherstellen, dass ein verwandtes Objekt mit einer has_one-Beziehung erstellt wird.Testen, ob in rspec eine Verknüpfung existiert

So würde mein Code wie folgt in dem Modell aussehen:

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 

Ich habe eine Fabrik für ein Gerät:

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 

In meinem rspec Modell Test stelle ich mir den Code aussehen würde, dies:

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 

ich bin nicht shoulda oder irgendetwas verwendet wird, nur versucht, Rspec zu verstehen besser.

Antwort

2

Ich würde so etwas tun:

subject(:device) { Device.create(attributes_for(:device)) } 

it 'has a scan option' do 
    expect(device.scan_option).to be_present 
end 

I Device.create statt FactoryGirl.create verwenden würden, um sicherzustellen, dass die Klasse selbst das zugehörige Objekt erstellt und nicht von der Factory erstellt wird.

+0

Gibt es einen Unterschied zwischen "be_present" und "be", wie in einer der Antworten vorgeschlagen? – Godzilla74

+0

'be_present' testet, dass das Aufrufen von' present? 'Auf der' scan_option' 'wahr' aufruft. Während ['be '] (https://www.relishapp.com/rspec/rspec-expectations/docs/built-in-matchers/be-matcher) testet, dass' scan_option 'truthy ist (nicht' nil' oder 'false '). In diesem Beispiel macht es keinen Unterschied im Ergebnis, aber IMO liest es viel besser mit 'be_present'. – spickermann

0

Sie sollten nur in der Lage sein, das Gerät zu speichern und dann den Verein anrufen und überprüfen es gibt etwas

it "creates a scan_option after_create" do 
    subject = build(:device) 

    subject.save 

    expect(subject.scan_option).to be 
end 
0

mehrere Möglichkeiten:

subject = build(:device) 
expect(subject.scan_option).not_to be_nil 

expect { build(:device) }.to change(ScanOption, :count).by(1) 

Wahrscheinlich gewonnen Geh nicht, weil du nur deine Fabrik gebaut hast.

Um für den Rückruf ausgeführt werden Sie müssen es tatsächlich in der Datenbank bestehen:

subject = create(:device) 
Verwandte Themen