我试图用下面的虚拟方法模拟一个链接的Django模型对象,

# utils.py
def foo_something_exist():
   if Foo.objects.get(a='something').exist():
      return 'exist'



# test.py
import unittest.mock import patch

import utils

.
.
.
@patch('utils.Foo')
def test_foo_something_exist_returns_none(self, mock_foo):
   mock_foo.objects.get.exists.return_value = False
   self.assertIsNone(utils.foo_something_exist()) 
.
.
.

test_foo_something_exist()次测试失败.我在utils中发现了Foo.objects.get(a='something').exist().py是MagicMock对象(<MagicMock name='Member.objects.get().exists()' id='xxxxxx'>)而不是False,这导致了该测试功能的失败.是的,我也试过mock_foo.objects.return_value.get.return_value.exists.return_value = False,这是在一篇帖子中提到的.正确模拟模型对象(及其链接方法)的指针/提示非常有用.

提前谢谢你.

推荐答案

不要修补模型本身,而是修补模型.对象,然后模拟链的每个部分:

@patch('utils.Foo.objects')
def test_foo_something_exist_returns_none(self, mock_foo):
    # just to show how to do it with longer chains
    # mock_foo.filter.return_value = mock_foo
    # mock_foo.exclude.return_value = mock_foo            
    mock_foo.get.return_value = mock_foo
    mock_foo.exists.return_value = False

    self.assertIsNone(utils.foo_something_exist()) 

这也适用于.filter().exclude()和其他模型操作.在测试Django模型时,我还发现Model Mommy个非常有用.

Python-3.x相关问答推荐

为什么打印语句在Python多处理脚本中执行两次?

谁能解释一下这个带邮编的多功能环路?

在Pandas 数据帧中为小于5位的邮政编码添加前导零

给定panda代码的分组和百分比分布pyspark等价

命名空间前缀无效

公开数据中的卫星图像网页抓取优化

通过匹配第一列的行值,逐个单元格地添加两个Pandas 数据框中的浮点数

如果原始字符串包含正斜杠,如何返回具有不同可能性的新字符串

过滤阈值大小数据以使用 Pyspark 或 Python 读取

Python多进程:运行一个类的多个实例,将所有子进程保留在内存中

从日志(log)文件中查找延迟最低的用户

BeautifulSoup 和 pd.read_html - 如何将链接保存到最终数据框中的单独列中?

Python3 AttributeError:列表对象没有属性清除

为什么不切换到 Python 3.x?

使用 distutils 分发预编译的 python 扩展模块

如何为 Python 中的线程设置异步事件循环?

pip install dryscrape 失败并显示错误:[Errno 2] 没有这样的文件或目录:'src/webkit_server'?

如何在 jupyter notebook 5 中逐行分析 python 3.5 代码

从 csv 中删除单行而不复制文件

如何从 Base64 转换为字符串 Python 3.2