2016-07-28 63 views
1

當我在功能測試中使用硒進行渲染時,我得到了不同的模板結果。通常訪問頁面,我看到對象被渲染。在功能測試期間,頁面是空白的(它甚至不會在空子句中顯示文本)。我編寫了一個小型的Django應用程序來測試它,並確保我不會發瘋,並且我得到了相同的問題一貫。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'。所以它呈現一個空白字符串。 (它期望找到'N對象',但是會找到'')。(編輯:正如Vladmir在下面指出的那樣,我錯過了實際獲取url的方式。所以,我無法重現我的軟件在這個例子中遇到的問題。故障。) – Terrence

回答

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

嗯,我覺得啞巴。我以爲我在重現我的軟件存在的問題,而我只是產生了一個不同的問題。謝謝。 – Terrence