2011-11-13 3 views
1

sqlalchemy 코드의 단위 테스트를 시도하고 있습니다. 내 단위 테스트에서 지금Cant는 sqlalchemy 코드의 단위 테스트에서 assertRaises를 사용하는 동안 결과를 이해합니다.

def add_user(*user_details): 
     try: 
      u = User(*user_details) 
      session.add(u) 
      session.commit() 
     except: 
      session.rollback() 

:

def testDuplicate(self): 
     add_user(user_detail1,user_detail2) 
     self.assertRaises(IntegrityError, add_user(user_detail1,user_detail2)) 

이 테스트는 add_user 함수 호출이 무결성 오류가 발생하면 성공하고 예외가없는 경우 실패합니다. 그러나 문제는 두 경우 모두에서 테스트가 성공한다는 것입니다.

왜 이런 일이 발생합니까? 내 코드에 이상이 있습니까? 또는 assertRaises가 내가 기대하는 것과 다르게 작동합니까?

처음에는 try 절을 제외하고 예외가 처리되었고 assertRaises는 예외가 발생하지 않기 때문에이 문제가 발생한다고 생각했습니다. 하지만이 경우에 assertRaises가 예외를받지 못하면 실패했을 것입니다.

단위 테스트를 작성하는 데 문제가있는 경우, 코딩 습관에 단위 테스트를 통합하는 방법을 배우고 있기 때문에 저에게 알려주십시오.

+1

'add_user' 메소드에서'try/except' 블록을 제거하십시오. 그러면 오류가 표시됩니다. 또는 단순히'session.rollback' 호출을 제거하십시오. – rubik

+0

try/except를 제거하면 오류가 발생하지만 여전히 테스트는 통과되지 않지만 assertRaises는 예외가 발생한 경우 테스트를 통과하게 만들지 않습니다. – codecool

+0

Kathy Van Stone의 답변을 확인하십시오 ... – rubik

답변

3

대신를 작성해야 잘못 assertRaises를 사용하고 있습니다 :

self.assertRaises(IntegrityError, add_user, user_detail1, user_detail2) 

당신은 기능을 제공하고 별도로 assertRaises에 인수가 그래서 함수가 호출 될 때 제어 할 수 있습니다 (예를 들어 assertRaises에서 try/except 블록) .

다른 문제는 테스트중인 기능이 오류를 삼키는 것입니다.

def add_user(*user_details): 
     try: 
      u = User(*user_details) 
      session.add(u) 
      session.commit() 
     except: 
      session.rollback() 
      raise 

(트랜잭션을 롤백 할 수 있음)을 시도해보십시오

+0

thnx that worked :) – codecool

관련 문제