python如何模拟方法?

时间:2016-04-05 15:35:01

标签: python mocking patch

我想测试一个http post方法,这个方法会调用一些服务,但是服务无法在本地测试机上工作,所以我想模仿它。

test.py:

@route(bp, '/count', methods=['POST'])
def count():
   from module import service
   ...
   total, ids = service(id, page, count) // total is a integer, ids is a list.
   ...
   return {'total': total, 'ids': ids}

测试用例:

@mock.patch("module.service")
def test_search_user(self, mock_service):
    mock_service.return_value=(1, [])

    url = url_for('users.count')
    params = { .... }

    response = self._test_app.post_json(
        url, params, headers=self.request_headers, expect_errors=True)

    self.assertEqual(response.status_code, 200)

但测试用例总是失败,它试图调用service方法,但它无法在我的机器上运行。我只是想嘲笑它,但不起作用。

任何人都可以帮助我!提前谢谢!

根据@syntonym的回答,我的测试用例应该是这样写的:

@mock.patch("test.service")
def test_search_user(self, mock_service):
    mock_service.return_value=(1, [])

1 个答案:

答案 0 :(得分:2)

@mock.patch实际上采用了查找名称 - 而不是您要修补的对象实际驻留的位置。 The documentation reads

  

patch()通过(临时)更改名称指向的对象与另一个对象。 [...]   基本原则是你可以修改查找对象的位置,   它不一定与定义它的位置相同。