#34947 closed Bug (invalid)
assertContains fails when there is unicode in the response json
Reported by: | ideesnoires | Owned by: | nobody |
---|---|---|---|
Component: | Testing framework | Version: | 4.2 |
Severity: | Normal | Keywords: | unicode, testing, assertcontains |
Cc: | Triage Stage: | Unreviewed | |
Has patch: | no | Needs documentation: | no |
Needs tests: | no | Patch needs improvement: | no |
Easy pickings: | no | UI/UX: | no |
Description
#views.py class Umlaut(View): def get(self, request): return JsonResponse({"uml": "äuuuß"}) #tests.py class UmlautTest(TestCase): def test_contains(self): response = self.client.get('/') self.assertContains(response, 'ä') # produces: ====================================================================== FAIL: test_contains (app.tests.UmlautTest.test_contains) ---------------------------------------------------------------------- Traceback (most recent call last): File "/Users/markus/dev/testcase/p/app/tests.py", line 6, in test_contains self.assertContains(response, 'ä') File "/Users/markus/Library/Caches/pypoetry/virtualenvs/testcase-H5bBokyv-py3.12/lib/python3.12/site-packages/django/test/testcases.py", line 660, in assertContains self.assertTrue( AssertionError: False is not true : Couldn't find 'ä' in response ---------------------------------------------------------------------- Ran 1 test in 0.002s FAILED (failures=1) #but is succesful when checking for 'uuu'
Note:
See TracTickets
for help on using tickets.
Hi ideesnoires,
Thanks for your report though, the problem here isn't
assertContains()
, it's json serialisation in Python: https://docs.python.org/3/library/json.html#character-encodingsBy default json.dumps() sets
ensure_ascii=True
. This should be false for unicode.Here's the correct way to respond with unicode:
As per: https://docs.djangoproject.com/en/4.2/ref/request-response/#django.http.JsonResponse
With that your test will pass :)