如何使用Mock @patch获取通话计数?

时间:2014-02-24 08:55:48

标签: python unit-testing mocking

我正在为我们正在开发的某个库编写单元测试。该库使用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

1 个答案:

答案 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

现在您拥有patchside_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}}对返回的对象进行进一步的断言。