2012-12-19 105 views
15

我是Ruby的新手(第一天使用ruby),所以請原諒任何新手問題和缺乏理解。如何測試JSON REST API

我在嘗試驗證對http標註的響應。

例如,假設端點是:

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

而且,我試圖通過發送這樣一個GET請求來驗證用戶的身份:

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

現在,我要驗證響應並執行以下操作: - 解析響應以確保其有效JSON - 進行一些驗證並驗證JSON是否具有正確的數據(例如,驗證id == 4) - 如果發生錯誤是e ncountered,使用'raise'方法引發異常。

在我的第一個愚蠢的嘗試我試過如下:

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

現在,這個返回獲取當前用戶是成功的,但實際上,我怎麼解析JSON,驗證正確的ID,併發出發生錯誤時發生異常嗎?

+1

http://stackoverflow.com/questions/5410682/parsing-a-json-string-in-ruby –

+1

@AaronKurtzhals:它是爲客戶端代碼設置測試,而不是嚴格解析JSON字符串。 –

回答

17

而是拋出一個異常,寫一個測試。

直接的方法,使用從標準庫的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 4db7e46008f215cdb7d120cdd7", 
     "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字符串轉換爲紅寶石hash

Getting started with minitest

如果你使用的是ruby 1.8,你需要ins高json gem並安裝minitest gem,或切換到較舊的testunit API。如果你選擇後者,那麼你就需要改變require 'minitest/autorun' - >require 'test/unit'MiniTest::Unit::TestCase - 晚>Test::Unit::TestCase

+0

嗨@ireddick,感謝您的幫助。我試過你的例子,但得到了錯誤:未初始化的常量Minitest – Dman100

+0

我正在運行1.9.3p327(2012-11-10)[i386-mingw321] – Dman100

+0

@ Dman100 - 「未初始化的恆定Minitest」表示您錯誤鍵入MiniTest – ireddick

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-schema(json模式驗證器)。 Thoughtbot的人有a detailed guide如何使用json模式驗證器並在此博客文章中創建自己的匹配器。

Understanding JSON Schema是我得到了很多關於如何爲JSON文檔創建模式的有用信息。

  • match_json
  • 這是我們自己的匹配,我們最近發佈了match_json寶石。使用它你可以測試你的json的結構和值。以下是此匹配的兩大特點:

    • ,如果你不知道確切值,你可以像使用{ID},{UUID} {} DATE_TIME等模式我們已經預定義模式,但你可以添加你自己也是。
    • 你得到明確的失敗信息你的json有什麼問題,例如「> array」中找不到「5」:[1,2,3]