2013-01-18 4 views
9

동일한 테스트 케이스 클래스에서 다른 테스트를 통과하는 단정에서 실패한 단위 테스트가 있습니다.장고 테스트 클라이언트 응답에 빈 컨텍스트가 있음

def test_home(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertEqual(resp.status_code, 200) 
    self.assertTrue('a_formset' in resp.context) 

여기 실패한 테스트입니다 :

여기 통과 테스트의 두 번째 테스트에서

def test_number_initial_number_of_forms(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1) 

, 나는 오류 TypeError: 'NoneType' object has no attribute '__getitem__'를 얻을. 내가

def test_number_initial_number_of_forms(self): 
    c = Client() 
    resp = c.get('/') 
    self.assertTrue('a_formset' in resp.context) 
    self.assertEqual(resp.context['a_formset'].total_form_count(), 1) 

로 두 번째 테스트를 실행하면

나는 오류 TypeError: argument of type 'NoneType' is not iterable를 얻을. 두 번째 테스트에서 print 문을 통해 response.content에 예상되는 페이지가 포함되어 있고 상태 코드가 올바른지 그리고 템플릿이 올바른지 확인했습니다. 그러나 두 번째 테스트에서 응답의 컨텍스트는 일관되게 None입니다.

표준 "python manage.py test ..."인터페이스를 통해 장고 테스트를 실행 중이므로 "context is empty from the shell"문제가 발생한다고 생각하지 않습니다.

이 경우 어떻게됩니까?

편집 :

나는 각각의 테스트에 print type(resp.context['a_formset'])를 추가하는 경우, 작동 테스트를 위해 내가 <class 'django.forms.formsets.AFormFormSet'>를 얻을. 작동하지 않는 테스트의 경우 다시 TypeError: 'NoneType' object has no attribute '__getitem__'이됩니다.

+0

'a_form'은 (는) formset입니까? – sneawo

+0

@sneawo 네, formset입니다. –

+1

작업 및 비 작동 테스트에서'print type (resp.context [ 'a_formset'])'행을 임시로 추가하십시오. 당신은 당신이 기대하는 것을 얻지 못할 수도 있습니다. –

답변

4

오늘도 같은 문제가 발생합니다. 테스트는, 같은 페이지가 내가 연구를 만들어 1) 테스트 클라이언트가 컨텍스트를 채우기 위해 신호를 사용하는 것을 발견

response.context에 무관 얻을 수 2 내보기 방법은 두 번째 테스트

에 대한 호출되지 않습니다)

디버거가 켜져 있고 죄책감이 '캐시 미들웨어'임을 알게되었습니다. 내가 this ticket 및이 SO question (후자는 해결책이 있음)을 발견했다는 것을 알았습니다.

따라서 짧은 설명 : 두 번째 요청은보기가 아닌 캐시에서 제공되므로보기가 실행되지 않고 테스트 클라이언트가 신호를받지 못하고 컨텍스트를 채울 수 없습니다.

내 프로젝트에 대한 캐시 미들웨어를 사용하지 않도록 설정할 수없는, 그래서 난 내 설정에 다음 해킹 라인을 추가 :

if 'test' in sys.argv: 
    CACHE_MIDDLEWARE_SECONDS = 0 

희망이 당신은 몇 가지 오류에 달려 있기 때문에 누군가가

5

그건 도움이 종료 쉘을 다시 시작했다.

그러나 당신에게 환경 ... 내 문제를했다

from django.test.utils import setup_test_environment 
>>> setup_test_environment() 

을 시작하는 것을 잊었다. 희망이 작동 ...

+0

완벽하게 작동했습니다. 감사합니다. – intelis

관련 문제