将API响应的属性/属性与本地存根进行比较

时间:2014-08-10 07:16:20

标签: ruby-on-rails ruby json ruby-on-rails-4 rspec

我的model中有一个方法,它返回我转换为json的object

got: "{\"@type\":\"accountResource\",\"createdAt\":\"2014-08-07T14:31:58\",\"createdBy\":2,\"updatedAt\":\"2014-08-07T14:31:58\",\"updatedBy\":2,\"accountid\":2055,\"name\":\"Test\",\"description\":\"Something about Test\",\"disabled\":false}"

如何将attributes单独与我的stub进行比较。

以下是我的规格

it "can create an account" do    
    acc = FactoryGirl.create(:account, name: "Test", 
                         description: "Something about Test");
    create_account = Account.create(account: acc)
    expect(create_account.to_json).to eq(what)     
end

我需要与我的本地json进行比较,从API返回的json与本地的attributes相同。我不想检查值,仅针对attributes是否相同。

1 个答案:

答案 0 :(得分:3)

我没有看到任何要求。我想,你想要的是这样的:

it "can create an account" do
  attrs = Factory.attributes_for(:account)
  account = Factory.create(:account, attrs) # instead of this you should do you request
  expect(JSON.parse(account.to_json)).to eq(attrs)
end

如果请求期望将是下一个:

expect(JSON.parse(response.body)).to eq(attrs)

如果你想跳过像created_at这样的属性,你需要一个像这样的自定义匹配器:

RSpec::Matchers.define :eq_attributes do |sample|
  match do |actual|
    sample.reject { |k, _| %w(id updated_at created_at).include? k }.all? { |k, v| actual[k] == v }
  end
end

它会跳过idupdated_atcreated_at。随之而来的是下一个:

expect(JSON.parse(response.body)).to eq_attributes(attrs)