我有这样的代码:

//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)

Question: It this the expected behaviour that username = get_user_from*db(1) returns "Alice" in my case?(在YouTube视频中,它返回"被嘲笑的爱丽丝")or am I just doing something wrong?

推荐答案

你应该导入after个Mocking,否则它仍然引用old个非Mocking项:

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"

模拟工具不能更改原始对象的行为,因此基本上,它用一个行为不同的函数来替换它.

Django相关问答推荐

如何在Django模板中获取组中对象的整体计数器(&Q;)?

django-filter compose 过滤的 url

Django:如何 Select 没有其他项目引用的项目?

如何连接到 docker 容器中的 postgres 数据库?

在Django Rest Framework中按模型属性排序时如何避免重新计算?

设置 SECURE_HSTS_SECONDS 可以不可逆转地 destruct 您的网站?

Django rest框架覆盖ViewSet中的page_size

Django Blob 模型字段

Django rest-auth allauth 注册,带有邮箱、名字和姓氏,没有用户名

如何验证对象是否存在于多线程中

Django:显示在每个页面上加载页面所花费的时间

Django中的自定义排序

如何在 Django 1.9 中删除 DB (sqlite3) 以从头开始?

Django - 一起为 2 个或更多字段创建唯一的数据库约束

get_or_create() 是否必须立即保存?

将属性添加到 Django 模型的 Meta 类中

Django 的 Select .如何设置默认选项?

Django 中的 Python 日志(log)记录

BASE DIR 的绝对路径是什么?

Django中'related_name'和'related_query_name'属性之间的区别?