Python3 Unittest模拟请求模块

时间:2016-12-17 15:18:19

标签: python unit-testing mocking

我很乐意在Java的Mockito库中使用依赖注入,但是使用Python3的Request模块几乎没有经验。我试图断言调用prepare实例的self.assertTrue(mock_request.prepare.called)方法。但是,测试在断言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() 上失败了。有人可以告诉我如何通过测试吗?

android:maxSdkVersion="18"

1 个答案:

答案 0 :(得分:4)

您的代码永远不会直接访问prepare上的Request。该方法是在Request()调用的返回值上访问的,因此请使用Mock.return_value attribute进行测试:

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属性访问,如上所示。

相关问题