5

下面打印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"))
4

2 回答 2

6

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

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

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

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"))

应该工作得更好。

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

有关更多详细信息,请参阅文档。

于 2020-06-18T12:38:03.380 回答
2

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

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

于 2020-06-18T13:28:50.653 回答