2015-02-10 3 views
3

Я только начал с Django и подумал, что кто-то может просветить меня про простой тест, который я написал, который должен пройти, но, очевидно, нет. Ну, я говорю, что это должно быть, но, будучи довольно новым для Django, я полагаю, что моя нехватка знаний - причина, по которой она терпит неудачу.Тест не проходит в Django, когда он должен

Я продлил модель пользователя django с другой моделью и отношениями один к одному, как предложено в документах, чтобы добавить поле к модели. Эта модель, а именно UserStep, просто содержит целое число, начинающееся с нуля. Я решил также расширить менеджер, чтобы реализовать метод с именем setUserStep, который устанавливает шаг в новое значение, если условие выполнено.

models.py

class UserStepManager(models.Manager): 
    def setUserStep(self, user, conditional_step, step): 
     if user.userstep.step == conditional_step: 
      user.userstep.step = step 
      user.userstep.save() 


class UserStep(models.Model): 
    """This model holds the user step count""" 
    user = models.OneToOneField(User) 
    step = models.IntegerField(default=0) 
    # we set the custom manager 
    objects = UserStepManager() 

Затем, когда пользователь подписывает вверх, новый объект UserStep получает создан.

models.py

@receiver(user_signed_up) 
def complete_social_signup(sender, **kwargs): 
    """We start step to 0""" 
    user = kwargs.pop('user') 
    us = UserStep(user=user) 
    us.save() 

Я использую метод setUserStep, определенный в менеджере в одном из моих взглядов, которая вызывается, когда пользователь запрашивает /phase1/step1/ URL. Итак, если текущий шаг равен нулю, установите его равным 1. Просто так.

views.py

@login_required 
def step1(request): 
    context_dict = {} 
    UserStep.objects.setUserStep(request.user, 0, 1) 
    return render(request, 'phase1/step1.html', context_dict) 

Я испытал это поведение вручную, зарегистрировавшись и называя эту точку зрения, и все работало, как ожидалось. Когда я проверяю базу данных, user.userstep.step установлен в 1.

Тогда, будучи хорошим мальчиком, я решил начать писать некоторые тесты (я не в том месте, где я пишу тесты в первую очередь, я должен написать тесты для тестирования моих тестов до этого: P).

tests.py

class MyTests(TestCase): 

    def setUp(self): 
     self.test_user = User.objects.create_user(username="test", 
                email="[email protected]", 
                password="test") 
     # Mock user_signed_up signal. 
     us = UserStep(user=self.test_user) 
     us.save() 
     self.c = Client() 

    def test_step_gets_incremented(self): 
     self.c.login(username="test", password="test") 
     response = self.c.get('/phase1/step1/') 
     # user is logged in, the test should pass 
     self.assertEqual(response.status_code, 200) 
     current_user_step = self.test_user.userstep.step 
     # Test doesn't pass. WHY ME 
     self.assertEqual(current_user_step, 1) 

И БУМ AssertionError: 0 != 1

Я даже делаю простую печать в моем методе просмотра и он вызывается, как это должно быть.

Спасибо!

+1

Что происходит, когда вы явно извлекаете из db, используя что-то вроде 'us = UserStep.objects.get (user = self.test_user); self.assertEqual (us.step, 1) '? – dm03514

+0

: O Почему ???? ты прав! Он проходит! –

ответ

4

Вам необходимо перезагрузить test_user из базы данных, так как смена пользователя выполняется в другом экземпляре пользователя. Это означает, что если:

u1 = User.objects.get(id = 1) 
u2 = User.objects.get(id = 1) 

изменения u1 (даже если сохранен) не отражается на u2. Таким образом, вы должны снова получить пользователя из db после запроса.

+1

Вау, что я не знал, что такое python и django. Благодаря! примет за 7 минут. –

+0

Я не знаю, почему я думал, что это какой-то синглтон. –

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