2016-07-28 66 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