如何使用 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
函数导入文件的路径。
下面打印 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
函数导入文件的路径。