Django 模拟未按预期工作

FVo*_*Vod 3 python django mocking django-testing python-mock

我正在与 django 模拟作斗争;我什至简化了单元测试,但测试仍然失败。我想验证是否调用了一个方法(即使使用任何参数),但“assert_used_once_with”始终返回 False。目前我正在尝试:

@patch('utils.make_reset_password')
def test_shouldHaveCalledMakeResetToken(self, mocked):
    user = User.get(...)
    make_reset_password(user)
    mocked.assert_called_once_with(user)
Run Code Online (Sandbox Code Playgroud)

即使这个简单的例子也失败了:

AssertionError: Expected 'make_reset_password' to be called once. Called 0 times
Run Code Online (Sandbox Code Playgroud)

这怎么可能?我究竟做错了什么?

提前致谢

Duš*_*ďar 8

您必须使用完整路径utils,例如@patch('my_app.utils.make_reset_password'),然后在测试中调用一个调用的函数make_reset_password

@patch('my_app.utils.make_reset_password')
def test_shouldHaveCalledMakeResetToken(self, mock_make_reset_password):
    user = User.get(...)
    function_under_test(user)
    mock_make_reset_password.assert_called_once_with(user)
Run Code Online (Sandbox Code Playgroud)

编辑

我想到的另一件事是你没有嘲笑正确的功能。如果make_reset_password是从utils另一个模块导入的,那么您需要更改装饰器中的路径@patch

例如

# my_module.py
from my_app.utils import make_reset_password

def run_make_reset_password(user):
    make_reset_password(user)


# tests.py
@patch('my_app.my_module.make_reset_password')
def test_shouldHaveCalledMakeResetToken(self, mock_make_reset_password):
    user = User.get(...)
    run_make_reset_password(user)
    mock_make_reset_password.assert_called_once_with(user)
Run Code Online (Sandbox Code Playgroud)