我有这个代码:
// 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”)或者我只是做错了什么?
你应该在模拟之后导入它,否则它仍然引用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"
模拟工具无法更改原始对象的行为,因此基本上,它用行为不同的函数替换它。