ruby 用于rspec测试的JSON数据

5us2dqdw  于 2023-01-12  发布在  Ruby
关注(0)|答案(5)|浏览(158)

我正在创建一个接受JSON数据的API,并希望为它提供测试数据。
有没有类似于JSON数据工厂的东西?我希望在对象和JSON中有相同的数据可用,这样我就可以检查导入是否按预期工作。
JSON有严格定义的结构,所以我不能调用FactoryGirl(:record).to_json

tsm1rwdh

tsm1rwdh1#

在这种情况下,我将为要导入的JSON创建fixture文件。

json = JSON.parse(File.read("fixtures/valid_customer.json"))
customer = ImportsData.import(json)
customer.name.should eq(json["customer"]["name"])

我还没有看到过可以使用FactoryGirl设置属性,然后将其导入JSON的方法。您可能需要创建一个Map器,它将接收Customer对象并将其呈现为JSON,然后导入它。

mwg9r5ms

mwg9r5ms2#

按照Jesse的建议,在Rails5中现在可以使用file_fixturedocs
我只是使用一个小助手来阅读我的json fixture:

def json_data(filename:)
  file_content = file_fixture("#{filename}.json").read
  JSON.parse(file_content, symbolize_names: true)
end
nc1teljy

nc1teljy3#

实际上你可以用factorygirl做以下事情。

factory :json_data, class: OpenStruct do 
   //fields
end

FactoryGirl.create(:json_data).marshal_dump.to_json
avkwfej4

avkwfej44#

不久前我们实现了FactoryJSON gem来解决这个问题。到目前为止,它运行得很好。自述文件涵盖了可能的用例。

j1dl9f46

j1dl9f465#

这里有一些东西对我来说很好用:我想创建深度嵌套的结构,而不需要为每个嵌套指定单独的工厂;我的用例是用webmock存根外部apis; fixture不适合我,因为我需要存根各种不同的数据。
定义以下基本工厂和支持代码:

FactoryBot.define do
  factory :json, class: OpenStruct do
    skip_create # Don't try to persist the object
  end
end

class JsonStrategy < FactoryBot::Strategy::Create
  def result(evaluation)
    super.to_json
  end

  def to_sym
    :json
  end
end

# Makes the function FactoryBot.json available,
# which automatically returns the hash as a json string.
FactoryBot.register_strategy(:json, JsonStrategy)

然后,我可以像这样定义实际的工厂:

FactoryBot.define do
  factory :json_response, parent: :json do
    # You can define any attributes you want here because it uses OpenStruct
    ids { [] }
    
    # Gets called to create the object FactoryBot uses. I return the actual Hash I want here,
    # and use the available attributes defined above to fill it with data.
    # class: OpenStruct from the parent class is only used so that arbitrary attributes can be used.
    initialize_with do
      ids.map do |id|
        {
          score: 90,
          data: {
            id: id,
          },
        }
      end
    end
  end
end

最后你可以这样使用它:

FactoryBot.json(:json_response, ids: [1,2])
=> "[{\"score\":90,\"data\":{\"id\":1}},{\"score\":90,\"data\":{\"id\":2}}]"

# Or if you just need the hash:
FactoryBot.create(:json_response, ids: [1,2])
[{:score=>90, :data=>{:id=>1}}, {:score=>90, :data=>{:id=>2}}]

相关问题