6

現在、アプリケーションの一部としてサードパーティのWebサービスに電話をかけています。これを行うためにRestClientgemを使用しています。同じことを行うために利用できるツールはたくさんあるので、それは問題ではありません。

私が興味を持っているのは、十分に優れたテストを行うことです。これは、サードパーティのWebサービスが何らかの理由で利用できない場合に、アプリケーションがどのように応答するかをシミュレートできます。ネットワークの遅延/複雑さのためにレート制限またはタイムアウトを超えたとしても、HTTPステータスコードのようなものを取得して、そのイベントでアプリケーションが何をするかをテストできるようにしたいだけです。

Test :: Unitでこれを行うための最良の方法は何ですか?現在、サードパーティサービスへの呼び出しは、私のコントローラの1つにカプセル化されています。リモートサービスのさまざまなエンドポイント用のいくつかのラッパーメソッドを備えた単純なモジュールがあります。サービスが利用できる場合と利用できない場合に、アプリケーションが正しいことを実行することを確認したいだけです。

Test :: Unitの隣に追加のフレームワークを使用して、これを実行するための正しい方法を「スタブ」できますか?明らかに、私はネットワークタイムアウトを強制することはできず、テストのためだけにIPtablesのようなものでハッキングを開始することは時間の価値がありません。FacebookやTwitterなどをWebアプリケーションに統合することが最近非常に人気があるため、この問題は何百万回も解決されたと確信しています。堅牢で制御された形式でこれらのAPIに到達するときに、失敗をどのようにテストしますか?

4

2 に答える 2

5

webmockのようなものを使用してすべてのhttpリクエストをモックすることをお勧めします(失敗したリクエストをモックするだけではありません)。テストを実行するたびに実際にサードパーティのサービスにアクセスする必要がなく、テストスイートが大幅に高速化されます。

WebmockはRestClientとTest::Unitをサポートしています。test/test_helper.rbこのコードをファイルに入れるだけです:

require 'webmock/test_unit' 

例として、ネットワークタイムアウトをテストするには:

stub_request(:any, 'www.example.net').to_timeout
RestClient.post('www.example.net', 'abc')    # ===> RestClient::RequestTimeout
于 2011-10-24T23:01:29.513 に答える
1

railscast:291(サブスクライバーのみ)がVCRとrspecを使用したテストについて話します(私は知っていますが、Test:Unitではありません)

とにかく、この種のことのためにVCRを使用することを検討することができます

于 2011-10-24T22:57:33.177 に答える