我正在为我们正在开发的某个库编写单元测试。该库使用requests.post()
对外部服务器执行POST HTTP请求。
在我的UT中,我显然不想联系真实的服务器,而是模仿响应。
为此,我写了一个类似的函数:
def mocked_post(url, headers, data, **kwargs):
response = Mock()
# Some logic, irrelevant here.
return response
我在单元测试类中修补了这个函数:
@patch('mylib.requests.post', mocked_post)
class MyTest(TestCase):
def test_foo(self):
# Some test logic
这很完美。
现在我想获得对我的模拟函数的调用次数。我试过mocked_post.call_count
,但那不存在。我试图在很多不同的对象上找到这个属性(包括mylib.requests.post
),但到目前为止还没有运气。
如何访问此模拟函数的call_count
?
答案 0 :(得分:47)
我不会在这里使用mocked_post
作为new
参数。我设置了Mock
的新@patch('mylib.requests.post')
class MyTest(TestCase):
def test_foo(self, post_mock):
post_mock.side_effect = mocked_post
# Some test logic
self.assertEqual(post_mock.call_count, 3)
代替:
Mock
现在您拥有patch
为side_effect
生成的对象作为所有测试方法的参数,因此您可以测试该模拟被调用的次数。
您也应该能够在装饰器中设置@patch('mylib.requests.post', side_effect=mocked_post)
class MyTest(TestCase):
def test_foo(self, post_mock):
# Some test logic
self.assertEqual(post_mock.call_count, 3)
属性,以应用于所有测试:
response
但是,您仍然无法访问返回的mock.DEFAULT
对象;您可能希望从mocked_post
返回post_mock.return_value
而不是在函数中创建一个{{1}},以便您可以使用{{1}}对返回的对象进行进一步的断言。