@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Django: assertInHTML は needle が haystack の任意の子要素と完全一致しないと Fail する

needle (検索したいもの)が HTML タグを含まない文字列の場合、 assertContains の感覚で「needle と一致する文字列が haystack の中にあれば OK」という使い方をしてしまいがちだが、 assertInHTML は HTML の木構造を意識するので「あるはずの文字列が見つからない!」というエラーで頭を抱えることになる。

以下の例のように、 haystack の HTML 構造内で任意の子要素と完全一致するような needle を与えれば OK。

gist.github.com

❯ python t.py -v
test_not_ok (__main__.InHTMLTestCase) ... FAIL
test_ok (__main__.InHTMLTestCase) ... ok
test_ok2 (__main__.InHTMLTestCase) ... ok

======================================================================
FAIL: test_not_ok (__main__.InHTMLTestCase)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "t.py", line 14, in test_not_ok
    self.assertInHTML('a', '<div>a<br>b</div>')
  File "/Users/kensuke.nagae/.anyenv/envs/pyenv/versions/3.6.10/lib/python3.6/site-packages/django/test/testcases.py", line 800, in assertInHTML
    self.assertTrue(real_count != 0, msg_prefix + "Couldn't find '%s' in response" % needle)
AssertionError: False is not true : Couldn't find 'a' in response

----------------------------------------------------------------------
Ran 3 tests in 0.053s

FAILED (failures=1)

https://docs.djangoproject.com/en/3.1/topics/testing/tools/#django.test.SimpleTestCase.assertInHTML