使用FactoryGirl构建json存根

时间:2014-08-08 14:12:47

标签: ruby-on-rails ruby ruby-on-rails-4 rspec factory-bot

我尝试使用工厂构建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

2 个答案:

答案 0 :(得分:3)

使用FactoryGirl创建一个json就像使用航天飞机剥离菠萝一样。在你努力尝试之后你会这样做,但它并不是为它创造的。

如果您在测试中重用此哈希结构,请将其存储在yaml文件中并创建一些帮助方法来读取它(您可以将它们放在spec / spec_helpers中)。

您的代码不起作用的原因:

FactoryGirl正在使用method_missing magic来分配值。在您的代码中,您不是要尝试执行任何方法,因为您只是列出字符串,因此不会触发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

答案 1 :(得分:1)

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