Fur*_*har 14 ruby ruby-on-rails rspec-rails factory-bot
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
失败:
1)消息应保存有效负载
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)>'
Run Code Online (Sandbox Code Playgroud)
cry*_*o28 22
FactoryGirl要求您先定义工厂.我们在文件spec/factories/messages.rb中说:
FactoryGirl.define do
factory :message do
bundle_id 1
order_id 2
...etc...
end
end
Run Code Online (Sandbox Code Playgroud)
在此之后,您将能够调用工厂构建创建如下:
FactoryGirl.build(:message) # => bundle_id == 1, order_id == 2
FactoryGirl.build(:message, order_id: 3) # => bundle_id == 1, order_id == 3
Run Code Online (Sandbox Code Playgroud)
但是,在您的特定情况下存在一个问题.FactoryGirl的默认构建器在ActiveRecord相似的界面上运行.它通过setter设置定义的属性,而不是通过传递给模型构造函数的attrs散列:
m = Message.new
m.bundle_id = 1
m.order_id = 2
Run Code Online (Sandbox Code Playgroud)
因此,您必须创建一个自定义构造函数来处理模型的接口(不符合类似ActiveRecord的模型)并将其注册到工厂定义中.有关详细信息,请参阅工厂女孩文档
让我告诉你一个这样做的例子.对不起,我没有测试它,但它应该给你一个线索:
FactoryGirl.define do
factory :message do
ignore do
# need to make all attributes transient to avoid FactoryGirl calling setters after object initialization
bundle_id 1
order_id 2
end
initialize_with do
new(payload: attributes)
end
end
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21472 次 |
| 最近记录: |