0
我試圖嘲弄鏈式Django的模型對象在以下假設法,如何模擬一個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.py中的Foo.objects.get(a='something').exist()
是MagicMock對象(<MagicMock name='Member.objects.get().exists()' id='xxxxxx'>
)而不是False
,這導致了此測試功能的失敗。是的,我也試過mock_foo.objects.return_value.get.return_value.exists.return_value = False
,這是在一篇文章中提到的。正確地模擬模型對象(使用鏈式方法)的指針/提示值得欣賞。
預先感謝您。
謝謝你的回答。我可以知道'mock_foo.get.return_value = mock_foo'是做什麼的嗎? – tebesfinwo
它使用修補後的對象作爲每個鏈接方法調用的返回值。所以你最終得到一個有方法的補丁對象,並且它們都返回相同的補丁對象。這種方式也無關緊要你鏈接方法調用的順序。 – masterfloda