機能テストでSeleniumを使用してレンダリングすると、テンプレートと異なる結果になります。通常、ページにアクセスすると、レンダリングされているオブジェクトが表示されます。機能テスト中、ページは空白です(空の節にテキストを表示しません)。私は小さな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)
テンプレート: 'Nオブジェクト':問題と
<html>
{% for m in ms %}
{% for n in m.n_set.all %}
{{ n }}
{% empty %}
THIS IS EMPTY
{% endfor %}
{% endfor %}
</html>
とテストは、(AssertionErrorが」で失敗します'' 'には見つかりません):
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'が ''"に見つかりませんでした。したがって、空の文字列でレンダリングされます。 (編集:「Vladmirが指摘しているように、私は実際にURLを取得するのを忘れていたので、私のソフトウェアがこの例で持っていた問題を再現することができませんでした。障害) – Terrence