如何使用RSpec测试JSON对象中单个字段的值

时间:2015-08-21 20:05:20

标签: ruby json rspec airborne

我正在尝试将RSpec与gem Airborne一起使用来测试人们在JSON响应中的字段值。来自API的对象。

代码:

  it 'GET list of people objects where gender = male' do
    get "/people?gender=male"
    expect_json('people.*', {gender: 'MALE'})
  end

因此,如果我的测试使用此特定过滤器(性别)进行API调用,我希望只会撤回具有男性性别的人。然而,这段代码失败了,因为每个人都会失败。对象有许多不同的键(:name,:age等)。我只想测试性别,但我无法通过它,因为expect_json期望人们中的所有键都被写入测试。

我已经梳理了Google / Airborne文档,但无济于事: https://github.com/brooklynDev/airborne

1 个答案:

答案 0 :(得分:1)

这是占位符回答 - 寻求更多细节:

这个link从Airborne示例产生JSON以下:

{
    "cars": [{
        "make": "Tesla",
        "model": "Model S",
        "owners": [
            {"name": "Bart Simpson"}
        ]
    }, {
        "make": "Lamborghini",
        "model": "Aventador",
        "owners": [
            {"name": "Peter Griffin"}

        ]
    }]
}

这是一个RSpec测试(它使用有效的Internet URL,所以任何人都可以尝试)

require 'airborne'

describe 'sample spec' do
  it 'should validate car make' do
    get 'https://raw.githubusercontent.com/brooklynDev/airborne/master/spec/test_responses/array_with_nested.json'
    expect_json('cars.*', make: 'Tesla')
  end
end

如果您使用rspec <filename>.rb运行上述测试,则​​会出现如下错误。由于其中一个JSON条目没有makeTesla,因此会出现此错误。但是,该示例演示了Airborne能够查看给定JSON数组中所有嵌套JSON对象的单个属性。

E:\elixir>rspec fun.rb
F

Failures:

  1) sample spec should validate car make
     Failure/Error: expect_json('cars.*', make: 'Tesla')

       expected: "Tesla"
            got: "Lamborghini"

       (compared using ==)
     # ./fun.rb:6:in `block (2 levels) in <top (required)>'

Finished in 3.98 seconds (files took 0.68346 seconds to load)
1 example, 1 failure

Failed examples:

rspec ./fun.rb:4 # sample spec should validate car make

请使用示例JSON和RSpec输出更新您的问题,以显示您的代码与上述示例的相似之处,就像它是,您不应该遇到此问题。