我正在尝试在以下虚拟方法中模拟链接的 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/