我如何模拟 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.