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

M3R*_*3RS 15 python pytest python-3.x 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"))
Run Code Online (Sandbox Code Playgroud)

Mas*_*inn 17

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

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
Run Code Online (Sandbox Code Playgroud)

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

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"))
Run Code Online (Sandbox Code Playgroud)

应该工作得更好。

对于使用此类导入的任何模块来说,这也是一个问题,它们需要修补使用点而不是定义点,因为当模拟运行时,用户模块可能已经拥有其副本。

请参阅文档了解更多详细信息。