如何使用 pytest-mock 指定模拟函数的 return 值?

How to specify return value of mocked function with pytest-mock?

下面打印 False。这不是模拟的工作方式吗?

我尝试更改函数的路径,但它出错了,所以路径似乎是正确的。我错过了什么?

import pytest

from deals.services.services import is_user_valid


class TestApi:
    def test_api(self, mocker):
        mocker.patch('deals.services.services.is_user_valid', return_value=True)
        print(is_user_valid("sdfds", "sdfsdf"))

这里的问题是您实际上是在执行以下操作:

from deals.services.services import is_user_valid
import deals.services.services
deals.services.services.is_user_valid = Mock(return_value=True)
# call local is_user_valid

通过导入 "terminal" 符号本身,您已经缩短了任何模拟的可能性,它现在是本地引用,因此更新 "remote" 引用不会影响本地版本。这意味着您应该保留 模块 本身的句柄,以便在每次访问时解析相关符号:

from deals.services import services

def test_api(mocker):
    mocker.patch('deals.services.services.is_user_valid', return_value=True)
    print(services.is_user_valid("sdfds", "sdfsdf"))

应该工作得更好。

这也是任何使用此类导入的模块的问题,它们需要修补使用点而不是定义点,因为到模拟运行时,机会是用户模块已经有他们的副本。

有关更多详细信息,请参阅 the documentation

我的实际问题比上面的最小版本更复杂。在不同的文件中使用了模拟函数。

有用的是在 imported/used 的地方修补函数,而不是在它定义的地方。 因此请提供 mocker.patch 函数导入文件的路径。