2016-12-17 7 views
1

私はJavaのMockitoライブラリでdependancy injectionを使いやすいですが、Python3のunittest.mockモジュールの使用経験はほとんどありません。私はRequestインスタンスのprepareメソッドが呼び出されると主張しようとしています。しかし、テストはアサーションself.assertTrue(mock_request.prepare.called)で失敗します。誰かがこの試験に合格する方法を教えてもらえますか?Python3ユニットテストモッキングリクエストモジュール

import requests 

import unittest 
from unittest import mock 

class Engine(object): 

    def get(self, **kwargs): 

     session = requests.Session() 
     req = requests.Request('GET', 'http://www.google.com', params=kwargs).prepare() 
     response = session.send(req, timeout=1) 


class TestEngine(unittest.TestCase): 

    @mock.patch('requests.Session') 
    @mock.patch('requests.Request') 
    def test_get(self, mock_request, mock_session): 

     e = Engine() 
     e.get() 

     self.assertTrue(mock_request.called) 
     self.assertTrue(mock_request.prepare.called) 

if __name__ == '__main__': 
    unittest.main()   

答えて

4

あなたのコードを直接Requestprepareにアクセスすることはありません。この方法は、そのためのテストので、代わりにMock.return_value attributeを使用することにより、Request()への呼び出しの戻り値にアクセスします。

self.assertTrue(mock_request.return_value.prepare.called) 
模擬問題をデバッグするとき、私はそれが参考にトップを Mock.mock_calls attributeをプリントアウトするために見つける

レベルのモックオブジェクト。 mock_request.mock_callsを印刷テストのための生成:

[call('GET', 'http://www.google.com', params={}), call().prepare()] 

call().prepare()が実際にアクセスされた(そして上記のようにcall()の結果は、Mock.return_value属性を介して通常アクセス可能である)ことを示します。