gpt4 book ai didi

ruby-on-rails - 工厂女孩在构建/创建时将参数传递给模型定义

转载 作者:数据小太阳 更新时间:2023-10-29 06:39:03 26 4
gpt4 key购买 nike

模型/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

规范/模型/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

错误日志

失败:

1) 消息应该保存payload

 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)>'

最佳答案

FactoryGirl 需要你先定义工厂。假设在文件 spec/factories/messages.rb 中:

FactoryGirl.define do
factory :message do
bundle_id 1
order_id 2
...etc...
end
end

在此之后,您将能够像这样调用工厂构建创建:

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

但是,您的具体情况存在一个问题。 FactoryGirl 的默认构建器在类似 ActiveRecord 的界面之上运行。它通过 setter 设置定义的属性,而不是通过传递给模型构造函数的散列属性:

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

所以你必须创建一个自定义构造函数来使用你的模型接口(interface)(它不符合类似 ActiveRecord 的模型)并将它注册到你的工厂定义中。参见 factory girl docs了解详情。

让我向您展示一个这样做的例子。对不起,我没有测试它,但它应该给你一个线索:

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

关于ruby-on-rails - 工厂女孩在构建/创建时将参数传递给模型定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17967947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com