2016-07-28 3 views
1

Ich erhalte verschiedene Ergebnisse von einer Vorlage, wenn ich es mit Selenium in einem Funktionstest rendern. Wenn ich die Seite normal betrachte, sehe ich, dass Objekte gerendert werden. Während eines Funktionstests ist die Seite leer (es wird nicht einmal der Text in der leeren Klausel dargestellt). Ich habe eine kleine Django-App geschrieben, um sie zu testen und sicherzustellen, dass ich nicht verrückt werde, und ich bekomme das Gleiche Problem konsequent.Django Reverse-Beziehung in Vorlage rendert sporadisch

Die Modelle:

class M(models.Model): 
    pass 


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

Aussicht:

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

Die Vorlage:

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

Und der Test mit einem Problem (nicht mit „AssertionError: 'N-Objekt' nicht gefunden in '' "):

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) 

Das Rendern der Vorlage in einem Test funktioniert jedoch einwandfrei. Und die Seite normal zu besuchen (nicht während eines Tests) funktioniert auch gut. Ich könnte einfach die Werte im Voraus in der Ansicht zusammensetzen und dann über Konstanten iterieren, aber ich bin neugierig, warum das nicht funktioniert. Was ist denn hier los?

+1

Aber was macht es, wenn Sie die Prüfung durchführen? –

+0

@ShangWang Oben habe ich gesagt, dass es mit "AssertionError: 'N object' nicht gefunden in ''" fehlschlägt. So rendert es mit einer leeren Zeichenkette. (Es erwartet, 'N Objekt' zu finden, aber findet '' statt.) (Bearbeiten: Wie Vladmir unten ausgeführt hat, habe ich es verpasst, die URL zu bekommen. Also konnte ich das Problem meiner Software mit diesem Beispiel nicht reproduzieren Schuld.) – Terrence

Antwort

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

Nun, ich fühle mich dumm. Ich dachte, dass ich das Problem reproduzieren würde, das meine Software hatte, und stattdessen produzierte ich gerade ein anderes Problem. Vielen Dank. – Terrence