模拟无法按预期工作(Django)

问题描述 投票:0回答:1

我有这个代码:

// app1.service.py


database = {
    1: "Alice",
    2: "Bob",
    3: "Charlie"
}


def get_user_from_db(user_id):
    return database.get(user_id)

// app1.tests.test_service.py

import pytest
from unittest import mock

from app1.service import get_user_from_db


@mock.patch("app1.service.get_user_from_db")
def test_get_user_from_db(mock_get_user_from_db):
    mock_get_user_from_db.return_value = "Mocked Alice"
    username = get_user_from_db(1)  # If I change it to mock_get_user_from_db(1) everything works fine
    assert username == "Mocked Alice"

当我在命令行中运行“pytest”时,我得到这个:

E       AssertionError: assert 'Alice' == 'Mocked Alice'
E         - Mocked Alice
E         + Alice

在我正在观看的教程中,get_user_from_db(1)返回“Mocked Alice”,但在我的本地计算机中它仅返回“Alice”。我用的时候效果很好

username = mock_get_user_from_db(1)

而不是

username = get_user_from_db(1)

问题:在我的例子中, username = get_user_from*db(1) 返回“Alice”,这是预期的行为吗?(在 YouTube 视频中,它返回“Mocked Alice”)或者我只是做错了什么?

django mocking pytest python-unittest pytest-django
1个回答
0
投票

你应该在模拟之后导入它,否则它仍然引用old非模拟项目:

from unittest import mock import pytest @mock.patch("app1.service.get_user_from_db") def test_get_user_from_db(mock_get_user_from_db): mock_get_user_from_db.return_value = 'Mocked Alice' from app1.service import get_user_from_db username = get_user_from_db( 1 ) # If I change it to mock_get_user_from_db(1) everything works fine assert username == "Mocked Alice"
模拟工具无法更改原始对象的行为,因此基本上,它用行为不同的函数替换它。

© www.soinside.com 2019 - 2024. All rights reserved.