使用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上获取和设置属性的简单性。