如何模拟Django模型管理器的方法?

时间:2016-12-06 15:38:53

标签: python django python-2.7 python-unittest python-mock

这是一个小班(在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的调用,返回MagicMock,并测试该方法返回我注入的内容。在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'>

为什么我没有收回我注入的模拟?如何正确编写此测试?

1 个答案:

答案 0 :(得分:1)

我认为这是你的问题:

user_class.objects.return_value = objects

你指示模拟器有一个功能&#34;对象&#34;返回右侧的对象 但是你的代码从不调用任何objects()函数。它访问User.objects属性,User在这里是一个Mock,因此User返回一个新的Mock on property access。