【发布时间】:2016-07-28 20:28:36
【问题描述】:
在功能测试中使用 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 object' not found 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)
但是在测试中手动渲染模板可以正常工作。并且像平常一样访问页面(不是在运行测试时)也可以正常工作。我可以提前在视图中组合值,然后迭代常量,但我很好奇为什么这不起作用。这是怎么回事?
【问题讨论】:
-
但是当你进行测试时它会呈现什么?
-
@ShangWang 上面,我说它失败了“AssertionError: 'N object' not found in ''”。所以它用一个空白字符串呈现。 (它希望找到 'N object',但找到了 ''。)(编辑:正如 Vladmir 在下面指出的那样,我实际上错过了获取 url。因此,我无法重现我的软件在此示例中遇到的问题。我的错误。)