ruby on rails - factory girl passing arguments to model definition on build/create -


models/message.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/models/message_spec.rb

require 'spec_helper'  describe message   'should save payload'     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

failures:

1) message should save payload

 failure/error: message = factorygirl.build(:message, {:payload=>{:order_id=>138251, :order_number=>"aw116554416"}, :concern=>"order_create"})  argumenterror:    wrong number of arguments (0 1)  # ./app/models/message.rb:4:in `initialize'  # ./spec/models/message_spec.rb:7:in `block (2 levels) in <top (required)>' 

factorygirl requires define factory first. let's in file spec/factories/messages.rb:

factorygirl.define   factory :message     bundle_id 1     order_id 2     ...etc...   end end 

after you'll able invoke factory build create this:

factorygirl.build(:message)  # => bundle_id == 1, order_id == 2 factorygirl.build(:message, order_id: 3) # => bundle_id == 1, order_id == 3 

however, there 1 problem in particular case. factorygirl's default builders operate on top of activerecord-alike interface. sets defined attributes through setters, not through hash of attrs passed model constructor:

m = message.new m.bundle_id = 1 m.order_id  = 2 

so have create custom constructor work interface of model (which doesn't conform activerecord-alike model) , register in factory definition. see factory girl docs details.

let me show example of doing so. sorry didn't test should give clue:

factorygirl.define   factory :message     ignore       # need make attributes transient avoid factorygirl calling setters after object initialization       bundle_id 1       order_id 2     end      initialize_with       new(payload: attributes)     end   end end 

Comments

Popular posts from this blog

basic authentication with http post params android -

vb.net - Virtual Keyboard commands -

css - Firefox for ubuntu renders wrong colors -