factory girl übergeben von Argumenten an Modell-definition auf build/erstellen
Modelle/Nachricht.rb
class Message
attr_reader :bundle_id, :order_id, :order_number, :event
def initialize(message)
hash = message
@bundle_id = hash[:payload][:bundle_id]
@order_id = hash[:payload][:order_id]
@order_number = hash[:payload][:order_number]
@event = hash[:concern]
end
end
spec/Modelle/message_spec.rb
require 'spec_helper'
describe Message do
it 'should save the payload' do
payload = {:payload=>{:order_id=>138251, :order_number=>"AW116554416"}, :concern=>"order_create"}
message = FactoryGirl.build(:message, {:payload=>{:order_id=>138251, :order_number=>"AW116554416"}, :concern=>"order_create"})
message.event.should == "order_create"
end
end
error_log
Ausfälle:
1) - Nachricht zu speichern, sollten die Nutzlast
Failure/Error: message = FactoryGirl.build(:message, {:payload=>{:order_id=>138251, :order_number=>"AW116554416"}, :concern=>"order_create"})
ArgumentError:
wrong number of arguments (0 for 1)
# ./app/models/message.rb:4:in `initialize'
# ./spec/models/message_spec.rb:7:in `block (2 levels) in <top (required)>'
InformationsquelleAutor Furqan Asghar | 2013-07-31
Du musst angemeldet sein, um einen Kommentar abzugeben.
FactoryGirl erfordert die Festlegung Fabrik-ersten. Sagen wir mal in einer spec-Datei/Fabriken/Nachrichten.rb:
Nach diesem werden Sie in der Lage zu berufen, Fabrik, bauen, erstellen, wie diese:
Allerdings gibt es ein problem in Ihrem Fall zu. FactoryGirl Standard-Bauherren arbeiten auf der Oberseite des ActiveRecord-alike-Schnittstelle. Er setzt die angegebenen Attribute über die setter, die nicht durch ein hash-Wert attrs Modell übergeben Konstruktor:
So erstellen Sie einen benutzerdefinierten Konstruktor zu arbeiten mit der Schnittstelle des Modells (was nicht konform ActiveRecord-alike-Modell) und registrieren Sie es in Ihrer Fabrik-definition. Sehen factory girl docs für details.
Lassen Sie mich Ihnen ein Beispiel zeigen, dies zu tun. Sorry habe ich nicht getestet, aber es sollte Euch einen Anhaltspunkt dafür geben:
Beachten Sie auch:
DEPRECATION WARNING: `#ignore` is deprecated and will be removed in 5.0. Please use `#transient` instead.
InformationsquelleAutor cryo28
Es ist, weil Sie über einen Konstruktor verfügen, mit zwingenden Argumenten. Sie haben ein paar Optionen;
1) Stellen Sie das argument nicht zwingend (obwohl dies bedeuten würde, das Sie ändern Sie Ihren code entsprechend Ihrer tests - frech!!!)
2) Verwenden Sie die "initialize_with" syntax in Ihrer Fabrik;
InformationsquelleAutor Mikey Hogarth