2017-02-14 8 views
2

変数モック方法:私のテストではインスタンス私はこのようなクラスのテストを記述しようとしています

from public_library import SuperClass 
from another_library import Foo 


class MyClass(SuperClass): 

    def __init__(self): 
     # Call super class 
     super(MyClass, self).__init__() 

     self._foo = Foo(
      name='Some Name', 
      thing='Some Thing', 
      # self.something is defined in SuperClass.__init__() 
      cool=self.something.cool(), 
     ) 

を、私はFooクラスを嘲笑し、適切に設定されてself._fooを確認するassert_called_once_with()を呼び出しています。しかし、返り値self.something.cool()を取得する方法を理解できません。

確かに戻り値をselfのインスタンス変数に設定し、それを私のテストで使用することはできますが、これは醜い解決策のようです。これを行うにはpatch()の方法がありますか?

+0

モック[それはと呼ばれていたものを記録](https://docs.python.org/3/library/unittest .mock.html#unittest.mock.Mock.mock_calls)。 – user2357112

+0

[こちら](https://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.call_args)もご覧ください。 – user2357112

+0

@ user2357112: 'mock_calls'はかなり役に立ちますが、' self.something'を 'MagicMock'オブジェクトにどのようにパッチするのか分かりません。 –

答えて

0

論理をテストするための推奨される方法は、最後に期待される結果をアサートすることです。私たちがあなたのロジックを知らないとすれば、どんな値も返されると期待できます。単体テストを実行すると、実際に関数を呼び出して戻り値を得ることができます。一般的な例:

def parse_http(): 
    response = socket.recvfrom(2048) # you don't want to wait for a connection to test your logic, so you mock it, how? 
    return response[response.find('\r\n\r\n'):] 

@patch('socket', 'recvfrom') 
def testParseHttp(socket_recv_from): 
    socket_recv_from.return_value = 'HTTP 1.1\r\n\r\nsomeresponse' 
    assert parse_http() == 'someresponse' 

希望私の意図は、嘲笑の戻り値とアサート戻り値を説明することであるとして、これはあなたの質問をクリア。コードがテストされていないにも動作するはずです

  • が、それは単なる例です
+0

'self._foo'が正しく作成されていることを確認します。私が 'Foo'クラスを' patch'し、 'assert mocked_foo.return_value == self._foo'を行うことを提案していますか?もしそうなら、 'name'が誤って' Some Name'から 'Same Name'に変更されたバグをテストでは捕まえません。 –

関連する問題