2013-10-30 10 views
6

httpリクエストを行うPythonでカスタムAPIをテストしていますが、実行するたびに実際の外部システムに要求したくありませんユニットテスト。私はAPI応答を動的に偽装するためにside_effect関数を持つPythonのモックライブラリを使用しています。 side_effectメソッドをクラスメソッドのように動作させるにはどうすればよいですか?ユニットテストでクラスメソッドとして動作するためのPython Mock side_effectの使用方法

import requests 

class MyApiClass(): 
    def make_request(self, params): 
     return requests.get('http://someurl.com', params=params) 

    def create_an_object(self, params): 
     return self.make_request(params) 

import unittest, mock 

def side_effect_func(self, params): 
    if params['name'] == 'Specific Name': 
     return {'text': 'Specific Action'} 
    else: 
     return {'text': 'General Action'} 

class MyApiTest(unittest.TestCase): 
    def setUp(self): 
     super(MyApiTest, self).setUp() 
     mocked_method = mock.Mock(side_effect=side_effect_func) 
     MyApiClass.make_request = mocked_method 

    def test_create_object(self): 
     api = MyApiClass() 
     params = {'name': 'Specific Name'} 
     r = api.create_an_object(params) # Complains that two arguments are needed! 
     self.assertEqual(r['text'], 'Specific Action') 

私は

TypeError: side_effect_func() takes exactly 2 arguments (1 given) 

このエラーを取得するが、私はside_effect_funcが最初の引数としてapi渡したいです。助けをよろしく!

答えて

4

最も簡単な方法は、モックメソッドを単一の引数にしてから、モックメソッド自体の中で静的にMyApiClassを参照することです。それ以外の場合は、クラスオブジェクト自体を擬似的に(基本的に擬似メタクラスを作成する)試してみるか、おそらくpartialを使ってモッククラスメソッドをその場で構築することができます。しかし、単一の引数/静的参照メソッドがあなたのために働くならば、それは私には最高のようです。

また、Mockドキュメントには、mocking an unbound method using patchがあります。これは、必要以上のものかもしれません。

+1

はい、ありがとうございます。私は、パッチを貼ったアンバウンドメソッドを嘲笑することが私の必要なものだと思います。そうでない場合は、MyApiClassをハードコーディングすることをお勧めします。 – conman

関連する問題