15

我是 ruby​​ 的新手(使用 ruby​​ 的第一天),所以请原谅任何新手问题和缺乏理解。

我正在尝试验证对 http 标注的响应。

例如,假设端点如下:

https://applicationname-api-sbox02.herokuapp.com 

而且,我正在尝试通过发送这样的获取请求来验证用户身份:

get_response = RestClient.get( "https://applicationname-api-sbox02.herokuapp.com/api/v1/users", 
                    {
                        "Content-Type" => "application/json",
                        "Authorization" => "token 4d012314b7e46008f215cdb7d120cdd7",
                        "Manufacturer-Token" => "8d0693ccfe65104600e2555d5af34213"
                    }
                ) 

现在,我想验证响应并执行以下操作: - 解析响应以确保它是有效的 JSON - 进行一些验证并验证 JSON 具有正确的数据(例如验证 id == 4) - 如果出现错误遇到,请使用“raise”方法引发异常。

在我第一次微弱的尝试中,我尝试了以下方法:

puts get_response.body
if get_response.code == 200
puts "********* Get current user successful"
else
puts "Get current user failed!!"
end 

现在,这返回了获取当前用户成功,但我如何真正解析 json,验证正确的 id,并在发生错误时引发异常?

4

4 回答 4

17

与其引发异常,不如编写一个测试。

一种直接的方法,使用来自 std lib 的 json 解析器和单元测试框架:

require 'minitest/autorun'
require 'rest_client'
require 'json'

class APITest < MiniTest::Unit::TestCase
  def setup
    response = RestClient.get("https://applicationname-api-sbox02.herokuapp.com/api/v1/users", 
      {
         "Content-Type" => "application/json",
         "Authorization" => "token 4d012314b7e46008f215cdb7d120cdd7",
         "Manufacturer-Token" => "8d0693ccfe65104600e2555d5af34213"
      }
    ) 
    @data = JSON.parse response.body
  end

  def test_id_correct
    assert_equal 4, @data['id']
  end
end

执行ruby $filename

JSON.parse将 JSON 字符串解析为 ruby​​ 哈希

开始使用 minitest

如果您使用的是 ruby​​ 1.8,则需要安装json gem并安装minitest gem或切换到旧的 testunit API。如果您选择后者,那么您需要更改require 'minitest/autorun'->require 'test/unit'MiniTest::Unit::TestCase->Test::Unit::TestCase

于 2012-12-19T15:32:36.980 回答
4

我参加聚会有点晚了,但我最近共同创建了一个 rspec 驱动的框架Airborne,专门为此目的而调用。看看:https ://github.com/brooklynDev/airborne

于 2014-09-18T18:24:28.583 回答
2

这是我们规范中的一个示例,因此您可以了解我们如何测试 json api:

it 'returns charge' do
  get "/charges/#{charge.id}", '', headers

  expect(response.status).to eq(200)
  expect(response).to match_response_schema(:charge)
  expect(response).to match_json(<<-JSON)
  {
    "id":"{id}",
    "email": "{email}",
    "ip": "127.0.0.1",
    "amount": 10500,
    "state": "captured",
    "captured_amount": 10500,
  }
  JSON
end

让我们仔细看看

  1. match_response_schema(:charge)

这个匹配器检查我们得到的响应中的 json 通常是有效的。我们为此使用json-schema(json 模式验证器)。Thoughtbot 的人在这篇博文中有详细的指南如何使用 json 模式验证器和创建自己的匹配器。

了解 JSON Schema是我获得很多关于如何为 JSON 文档创建模式的有用信息的地方。

  1. match_json

这是我们自己的匹配器,我们最近发布了match_json gem。使用它,您可以测试 json 的结构和值。这是此匹配器的两个重要功能:

  • 如果您不知道确切的值,可以使用 {id}、{uuid} {date_time} 等模式。我们有预定义的模式,但您也可以添加自己的模式。
  • 您会收到明确的失败消息您的 json 有什么问题,例如在“> array”中找不到“5”:[1,2,3]
于 2015-03-21T07:33:03.457 回答
0

可以使用 json gem 解析 json:http: //flori.github.com/json/

解析后的 json 是通过 key/value 访问的,就像在 javascript 中一样。您可以轻松验证这些值并有条件地引发错误。

引发错误是这样完成的:

raise "the ID was #{id} instead of 4"

编写单元测试可以使用 Test::Unit - http://www.ruby-doc.org/stdlib-1.9.3/libdoc/test/unit/rdoc/Test/Unit.html

于 2012-12-19T15:31:49.667 回答