我如何模拟 Django 模型管理器的方法?
How can I mock a method of a Django model manager?
这里有点class(在myapp/getters.py
):
from django.contrib.auth.models import User
class UserGetter:
def get_user(self):
return User.objects.get(username='username')
我想模拟对 User.objects.get
、return 和 MagicMock
的调用,并测试方法 return 是我注入的内容。在 myapp/tests/tests_getters.py
:
from unittest import TestCase
from django.contrib.auth.models import User, UserManager
from mock import patch, create_autospec
from myapp.getters import UserGetter
class MockTestCase(TestCase):
@patch('myapp.getters.User', autospec=True)
def test(self, user_class):
user = create_autospec(User)
objects = create_autospec(UserManager)
objects.get.return_value = user
user_class.objects.return_value = objects
self.assertEquals(user, UserGetter().get_user())
但是当我运行这个测试(python manage.py test myapp.tests.tests_getters
)我得到
AssertionError:
<MagicMock name='User.objects().get()' spec='User' id='4354507472'> !=
<MagicMock name='User.objects.get()' id='4360679248'>
为什么我没有取回我注入的模拟?如何正确编写此测试?
我认为这是你的问题:
user_class.objects.return_value = objects
您指示模拟具有 "objects" 函数 returns 右侧的对象。
但是您的代码从不调用任何 objects() 函数。它访问 User.objects 属性,User 在这里是一个 Mock,所以 User returns 一个新的 Mock on 属性 access.
这里有点class(在myapp/getters.py
):
from django.contrib.auth.models import User
class UserGetter:
def get_user(self):
return User.objects.get(username='username')
我想模拟对 User.objects.get
、return 和 MagicMock
的调用,并测试方法 return 是我注入的内容。在 myapp/tests/tests_getters.py
:
from unittest import TestCase
from django.contrib.auth.models import User, UserManager
from mock import patch, create_autospec
from myapp.getters import UserGetter
class MockTestCase(TestCase):
@patch('myapp.getters.User', autospec=True)
def test(self, user_class):
user = create_autospec(User)
objects = create_autospec(UserManager)
objects.get.return_value = user
user_class.objects.return_value = objects
self.assertEquals(user, UserGetter().get_user())
但是当我运行这个测试(python manage.py test myapp.tests.tests_getters
)我得到
AssertionError:
<MagicMock name='User.objects().get()' spec='User' id='4354507472'> !=
<MagicMock name='User.objects.get()' id='4360679248'>
为什么我没有取回我注入的模拟?如何正确编写此测试?
我认为这是你的问题:
user_class.objects.return_value = objects
您指示模拟具有 "objects" 函数 returns 右侧的对象。
但是您的代码从不调用任何 objects() 函数。它访问 User.objects 属性,User 在这里是一个 Mock,所以 User returns 一个新的 Mock on 属性 access.