使用FactoryGirl构建json存根
我尝试使用工厂构建一个json
,但是当我尝试build
它时它是空的。
以下是Factory
类。
require 'faker' FactoryGirl.define do factory :account do |f| f.name {Faker::Name.name} f.description {Faker::Name.description} end factory :accjson, class:Hash do "@type" "accountResource" "createdAt" "2014-08-07T14:31:58" "createdBy" "2" "disabled" "false" end end
以下是我试图建立的方式。
hashed_response = FactoryGirl.build(:accjson) expect(account.to_json).to eq(hashed_response.to_json);
但我的hashed_response
似乎总是空object
。
使用FactoryGirl创建一个json就像使用航天飞机剥离菠萝一样。 在你努力尝试之后你会做到这一点,但它并不是为它创造的。
如果您在测试中重用此哈希结构,请将其存储在yaml文件中并创建一些帮助方法来读取它(您可以将它们放在spec / spec_helpers中)。
您的代码不起作用的原因:
FactoryGirl正在使用method_missing
魔术来分配值。 在您的代码中,您不是要尝试执行任何方法,因为您只是列出字符串,因此不会触发method_missing
魔术。
使用FactoryGirl的方法(阅读顶部段落!):
为了完整性,有一种方法可以用FG来做到这一点,但不是很漂亮:
factory :accjson, class: OpenStruct do send :'@type', "accountResource" createdAt "2014-08-07T14:31:58" createdBy "2" disabled "false" end hashed_response = FactoryGirl.build(:accjson).marshal_dump.to_json
我已经使用hashie
gem实现了这个。
我的工厂看起来像这样:
FactoryGirl.define do factory :some_factory_name, class: Hashie::Mash do skip_create attribute1 { value } attribute2 { "test" } sequence(:attribute3) { |n| "AttributeValue#{n}" } end end
这对我来说效果很好,因为它的行为几乎就像一个Hash,但具有工厂的便利性以及在Struct
上获取和设置属性的简单性。