2016-12-06 2 views
0

Вот маленький класс (в myapp/getters.py):Как я могу издеваться над методом диспетчера модели Django?

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

Я думаю, что это ваша проблема:

user_class.objects.return_value = objects 

Вы проинструктировать издеваться иметь функцию «объекты», который возвращает объекты на правой стороне.
Но ваш код никогда не вызывает никаких объектов(). Он обращается к свойству User.objects, Пользователь здесь является Mock, поэтому User возвращает новый Mock для доступа к свойствам.

+0

Все. Исправление состоит в том, чтобы изменить 'user_class.objects.return_value = objects' на' user_class.objects = objects'. Он также работает, если я не исправляю 'User' и просто назначаю' User.objects', но я подозреваю, что это загрязнит другие тесты. –

Смежные вопросы