2012-11-03 2 views
2

그래서 장고에서 TDD를 연습하는 방법을 배우고 있으며 사소한 문제가 있습니다. 필자는 인증 된 시스템 사용자와 일대일 관계로 연결되는 사용자 지정 사용자 개체를 만들었습니다.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)) 

이렇게하면 생일은 날짜 필드이고 datetime 필드는 아닙니다. 내 질문은 실패 메시지의 일부로 예상 값과 실제 값을 덤프하는 어설 션의 대체 형식이 있거나 API를 오용하거나 오해 한 경우에 더 습관적입니까?

+1

덧붙여 말하면, UserProfiles를 보셨습니까? https://docs.djangoproject.com/en/1.4/topics/auth/#storing-additional-information-about-users (분명히 그들은 Django 1.5 th에서 변경 중임) – hwjp

+0

팁을위한 고맙습니다! 아직 장고 문서를 모두 읽지는 않았습니다. 나는 인터넷 주위에있는 많은 튜토리얼과 예제를 사용하여 속도를 높이려고 노력하고있다. "장고 제 2 판의 확실한 가이드"를 읽고있다. – Cliff

답변

4

장고는 assertEqual을 구현하지 않으며 단순히 파이썬의 unittest 모듈을 사용합니다. 당신이 필요로하는 무엇

은과 같이, 테스트 케이스 클래스 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에 제공하여이를 오버라이드했습니다. 그 것을 버리면 값을 인쇄합니다.

Gonzalo가 보여 주듯이 longMessage 속성을 사용하면 실제로 두 세계의 장점을 모두 누릴 수 있습니다.

+0

감사합니다. 네, 게시 직후 오버라이드를 알아 냈습니다. longMessage 속성은 상황을 더욱 좋게 만듭니다. – Cliff