2012-11-03 2 views
2

Итак, я изучаю, как практиковать TDD в Django, и у меня небольшие проблемы. Я создал пользовательский объект пользователя, который связывается с аутентифицированными пользователями системы в отношениях один к одному. У меня есть следующий тест, который осуществляет часть моего пользовательского класса пользователя:Django assertEqual не показывает фактические и ожидаемые значения

def test_creating_a_user_with_attributes(self): 
    myuser = Myuser.objects.create_user('Gary', email='[email protected]') 
    current_time = now() 
    myuser.birthday = current_time 
    myuser.save() 
    first_user = Myuser.objects.all()[0] 
    self.assertEqual(first_user.birthday, current_time, 'first_user.birthday should be equal to the current_time') 

Проблема заключается в том, что мой тест был провал, и я не мог сразу понять, почему. Ошибка подтверждения сообщила мне сообщение, и я был сбит с толку, потому что был уверен, что день рождения установлен на значение сейчас. Я закончил работу с рефакторированием своего утверждения, чтобы сделать провальное значение понятным.

self.assertEqual(first_user.birthday, current_time, 
     'first_user.birthday ' + str(first_user.birthday) + ' should equal ' + str(current_time)) 

Это показало, что день рождения был полем даты, а не полем даты. Мой вопрос заключается в том, что существует какая-то альтернативная форма утверждения, которая сбрасывает ожидаемые и фактические значения как часть сообщения об ошибке или если я каким-то образом злоупотребляю или неправильно понимаю API?

+1

Кстати, вы взглянули на UserProfiles? https://docs.djangoproject.com/en/1.4/topics/auth/#storing-additional-information-about-users (видимо, они меняются в Django 1.5 tho) – hwjp

+0

Thanx для подсказки! Я еще не читал все документы django. Я пытаюсь найти скорость, используя ряд обучающих программ и примеров, которые я нахожу в Интернете, и я читаю «Окончательное руководство по Django 2nd edition» – Cliff

ответ

4

Django не реализует assertEqual, он просто использует модуль Unittest для Python для этого.

Что вам нужно установить атрибут TruelongMessage для случая тестового класса, например, так:

class VerboseTestCase(TestCase): 
    longMessage = True 

    def test_creating_a_user_with_attributes(self): 
     myuser = Myuser.objects.create_user('Gary', email='[email protected]') 
     current_time = now() 
     myuser.birthday = current_time 
     myuser.save() 
     first_user = Myuser.objects.all()[0] 
     self.assertEqual(first_user.birthday, current_time, 'first_user.birthday should be equal to the current_time') 

Какой будет что-то вроде этого, если тест не пройден:

AssertionError: <datetime 1> != <datetime 2> : first_user.birthday should be equal to the current_time 

Этот объясняется в Python's unittest docs.

+0

Удивительный! Это именно то, что я искал, спасибо! – Cliff

2

Сообщение об ошибке показывает несоответствующие значения. Но вы переопределили это, предоставив третий аргумент assertEqual. Если вы оставите это, оно будет печатать значения.

Как показывает Гонсало, вы можете получить лучшее из обоих миров, используя атрибут longMessage.

+0

Спасибо! Да, я выяснил переопределение вскоре после публикации, а атрибут longMessage делает вещи еще лучше. – Cliff