python - 如何模拟 Django 模型对象(及其方法)?

标签 python django python-3.x unit-testing python-3.5

我正在尝试在以下虚拟方法中模拟链接的 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()测试失败。我发现Foo.objects.get(a='something').exist() utils.py 中是一个 MagicMock 对象( <MagicMock name='Member.objects.get().exists()' id='xxxxxx'> )而不是 False ,这导致了这个测试功能的失败。是的,我也尝试过 mock_foo.objects.return_value.get.return_value.exists.return_value = False ,在一个帖子中提到过。正确模拟模型对象(及其链式方法)的指针/提示是值得赞赏的。

提前谢谢您。

最佳答案

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

@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() 和其他模型操作。我还找到Model Mommy在测试 Django 模型时非常有用。

关于python - 如何模拟 Django 模型对象(及其方法)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45512749/

相关文章:

python - 如何将 JSON 数据读取到 Python 中

djangocms : move data from deprecated cmsplugin-filer-*-plugins to djangocms-*-plugins

python - 用颜色打印cmd

python-3.x - selenium.common.exceptions.ElementNotInteractableException : Message: element not interactable when clicking on an element using Selenium Python

python - 错误发生时如何自动启动交互式 session ?

python - 在同一模块的字段中加载类 - OpenErp

python - 通过 KeyboardInterrupt 停止 pyzmq 接收器

python - 在 django 1.6 中使用多个数据库会出现 "can' t do subqueries”错误

python - 如何保护目录?以及如何在用户注册时创建新目录?

python-3.x - 使用 Python 和服务主体通过 Microsoft Graph API 发送电子邮件