2016-07-28 7 views
1

기능 테스트에서 Selenium을 사용하여 렌더링 할 때 템플릿과 다른 결과가 나타납니다. 정상적으로 페이지를 방문하면 렌더링되는 객체를 볼 수 있습니다. 기능 테스트 중에는 페이지가 비어 있습니다 (빈 절의 텍스트도 렌더링되지 않습니다). 테스트를 위해 작은 장고 응용 프로그램을 작성하고 미쳐 가지 않을 것이라고 확인했습니다. 문제가 계속 발생합니다.Django 템플릿의 역방향 관계가 산발적으로 렌더링됩니다.

모델 :

class M(models.Model): 
    pass 


class N(models.Model): 
    m = models.ForeignKey(
     M, 
     null=True, 
     default=None, 
     ) 

뷰 :

def view_my_problem(request): 
    ms = M.objects.all() 
    context = {'ms': ms} 
    return render(request, 'my_problem_template.html', context) 

템플릿 : 문제 (와

<html> 
    {% for m in ms %} 
     {% for n in m.n_set.all %} 
      {{ n }} 
     {% empty %} 
      THIS IS EMPTY 
     {% endfor %} 
    {% endfor %} 
</html> 

그리고 테스트가 AssertionError를 "실패 : 'N 객체' '' '에서 찾을 수 없음) :

class FunctionalTest(StaticLiveServerTestCase): 

    @classmethod 
    def setUpClass(cls): 
     for arg in sys.argv: 
      if 'liveserver' in arg: 
       cls.server_url = 'http://' + arg.split('=')[1] 
       return 
     super().setUpClass() 
     cls.server_url = cls.live_server_url 

    @classmethod 
    def tearDownClass(cls): 
     if cls.server_url == cls.live_server_url: 
      super().tearDownClass() 

    def setUp(self): 
     self.browser = webdriver.Firefox() 
     self.browser.implicitly_wait(10) 

    def tearDown(self): 
     self.browser.close() 

    def test_my_problem(self): 
     m = M() 
     m.save() 
     n = N(m=m) 
     n.save() 
     self.assertEqual(N.objects.count(), 1) 
     self.assertEqual(M.objects.count(), 1) 
     self.assertEqual(m.n_set.count(), 1) 
     text = self.browser.find_element_by_tag_name('html').text 
     self.assertIn('N object', text) 

그러나 테스트에서 템플릿을 수동으로 렌더링하면 문제가 없습니다. 테스트를 실행하는 동안이 아니라 정상적인 페이지를 방문하면 잘 작동합니다. 나는 뷰에서 미리 값을 구성하고 상수를 반복 할 수는 있지만 왜 이것이 작동하지 않는지 궁금합니다. 무슨 일 이니?

+1

하지만 테스트를 수행 할 때 무엇이 ​​렌더링됩니까? –

+0

@ShangWang 위의, 나는 그것이 "AssertionError : 'N object'가 ''"에서 발견되지 않으면 실패했다고 말했다. 따라서 빈 문자열로 렌더링됩니다. (편집 : 블라드미르가 아래에서 지적했듯이 실제로 URL을 얻는 것을 놓쳤으므로 내 소프트웨어가이 예제에서 가진 문제를 재현 할 수 없었습니다. (편집 : 내 개체를 찾을 것으로 기대하지만 대신 '을 찾습니다.) 결함.) – Terrence

답변

0
self.browser.get(self.live_server_url) 
text = ... 
+0

글쎄, 나는 바보 같아. 나는 내 소프트웨어가 가지고있는 문제를 재현하고 있다고 생각했지만, 대신 나는 다른 문제를 만들어 냈다. 고맙습니다. – Terrence