15

私はルビー(ルビーを扱う初日)を初めて使用するので、初心者の質問や理解不足はご容赦ください。

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 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

例外を発生させる代わりに、テストを作成します。

stdlibの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 1.8を使用している場合は、json gemをインストールして、 minitest gemをインストールするか、古いtestunitAPIに切り替える必要があります。後者を選択した場合は、require 'minitest/autorun'->require 'test/unit'およびMiniTest::Unit::TestCase->を変更する必要がありますTest::Unit::TestCase

于 2012-12-19T15:32:36.980 に答える
4

私はパーティーに少し遅れていますが、最近、Airborneこの目的のためだけに呼び出されるrspec駆動型フレームワークを共同作成しました。それをチェックしてください:https ://github.com/brooklynDev/airborne

于 2014-09-18T18:24:28.583 に答える
2

これが私たちの仕様の例ですので、jsonapiをテストする方法を見ることができます:

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スキーマを理解することで、JSONドキュメントのスキーマを作成する方法に関する多くの有用な情報を得ることができました。

  1. match_json

これは私たち自身のマッチャーであり、最近match_jsongemをリリースしました。これを使用して、jsonの構造と値をテストできます。このマッチャーの2つの優れた機能は次のとおりです。

  • 正確な値がわからない場合は、{id}、{uuid} {date_time}などのパターンを使用できます。事前定義されたパターンがありますが、独自のパターンを追加することもできます。
  • jsonの何が問題になっているのか、明確な失敗メッセージが表示されます。たとえば、「5」が「>配列」に見つかりませんでした:[1,2,3]
于 2015-03-21T07:33:03.457 に答える
0

jsonの解析は、json gemを使用して実行できます:http://flori.github.com/json/

解析されたjsonは、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 に答える