2013-02-05 9 views
6

私は一般的なAPIのクライアントライブラリに取り組んでいます。現在、クライアントのすべての単体テストは、テストアカウントに対して実際のAPI呼び出しを行っています。PythonでAPIクライアントをテストするにはどうすればよいですか?

def test_get_foo_settings(self): 
    client = MyCustomClient(token, account) 
    results = client.get_foo_settings() 

    assert_is(type(results), list) 

私は私のテストアカウントに対する実際のAPI呼び出しを行う停止したいと思います:

は、ここでの例です。

これにどのように対処すればよいですか? Mockを使用して、クライアントとレスポンスへの呼び出しを模擬すべきですか?

また、私はこのクライアントライブラリを使って何をテストするのかについて戸惑っています。私は実際のAPIをテストするのに興味はありませんが、メソッドが呼び出されるようなさまざまな要素が含まれている場合、可能な戻り値の順列など - 私はテストしなければならないか、仮説を立てる(嘲笑した反応など)。

私のタイプのシナリオでモックを使用する方法の任意の方向および/またはサンプルは高く評価されます。

+0

私はちょうど 'fudge'、あなたがそれをチェックアウトする可能性があると呼ばれるテストのための興味深いモジュールについて学びました。 – BenDundee

答えて

6

あなたが実際にサービスに連絡するためにあなたのライブラリが使用する単一のインタフェースまたは関数呼び出しを最初に作成し、それからテスト中にカスタムモックを書くことによって、私は個人的にそれを行います。サービスは、HTTPを使用し、あなたがサービスに連絡する要求を使用している場合たとえば

、:のために、そして、

class MyClient(…): 
    def _do_get(self, suffix): 
     return requests.get(self.service_url + "/" + suffix).json() 

    def do_stuff(self): 
     return self._do_get("stuff") 

class MyClient(…): 
    def do_stuff(self): 
     result = requests.get(self.service_url + "/stuff") 
     return result.json() 

私が最初の要求の周りの小さなラッパーを書きますテストでは、私は関連する機能を模擬します:

class MyClientWithMocks(MyClient): 
    def _do_get(self, suffix): 
      self.request_log.append(suffix) 
      return self.send_result 

そして、このようなテストでそれを使用してください:

def test_stuff(self): 
    client = MyClientWithMocks(send_result="bar") 
    assert_equal(client.do_stuff(), "bar") 
    assert_contains(client.request_log, "stuff") 

あなたが実際のサービスに対するあなたのモックに対してそれらの両方を実行できるように物事が失敗し始めた場合、あなたは障害誰すばやく把握できるように、また、おそらく、あなたのテストを書くことが有利であろうそうです。

+0

この回答は、[この質問](http://stackoverflow.com/q/37885554/3001761)が示唆するように、*なぜ*あなたがこのアプローチを好むかについていくつかの説明から利益を得るでしょう! – jonrsharpe

+0

do.get()をdo not mockしてdo_stuff()がdo_get()から値を返すのではなく_do_get()を呼び出す方が理にかなっていますか? –

関連する問題