Django 模拟没有按预期工作

Django mocks not working as expected

我正在为 django mock 苦苦挣扎;我什至简化了单元测试,但测试仍然失败。我想验证是否调用了一个方法(即使使用任何参数),但 "assert_called_once_with" 总是 returns False。 目前我正在尝试:

@patch('utils.make_reset_password')
def test_shouldHaveCalledMakeResetToken(self, mocked):
    user = User.get(...)
    make_reset_password(user)
    mocked.assert_called_once_with(user)

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

AssertionError: Expected 'make_reset_password' to be called once. Called 0 times

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

提前致谢

您必须使用 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)

编辑

我想到的另一件事是你没有模拟正确的功能。如果 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)