Python如何模拟一个方法?

3

我希望测试一个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, [])

你第一个片段中的 service 应该被替换为 magickmock 吗?service 是从哪里来的?阅读此处关于在哪里打补丁的内容 - syntonym
看一下我的更新。我在一个模块中定义了service - pangpang
1
补丁是基于名称而不是实际类进行操作的。因此,如果您希望testmodule中的service引用模拟对象,则需要打补丁@mock.patch("testmodule.service"),而不是module.service。有关更多信息,请阅读此文档 - syntonym
@syntonym,是的,你说得对,我的patch()有误。非常感谢!请发布你的答案,我会接受它。 - pangpang
1个回答

3
@mock.patch 实际上是使用查找名称而不是要修补的对象实际存在的位置。 文档中写道:

patch() 通过将名称指向的对象(暂时)更改为另一个对象来工作。[...] 基本原则是您修补了一个对象被查找的地方,这个地方不一定与定义它的地方相同。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接