Python/Django: как утверждать, что результат теста блока содержит определенную строку?

В тестовом модуле python (на самом деле Django), что такое правильный оператор assert, который скажет мне, если мой результат теста содержит строку по моему выбору?

т.е. что-то вроде self.assertContainsTheString(result, {"car": ["toyota","honda"]})

Я хочу убедиться, что мой result содержит хотя бы объект json (или строку), который я указал в качестве второго аргумента выше, то есть {"car": ["toyota","honda"]}

Ответ 1

self.assertContains(result, "abcd")

Вы можете изменить его для работы с json.

Используйте self.assertContains только для объектов HttpResponse. Для других объектов используйте self.assertIn.

Ответ 2

Чтобы утверждать, что строка является или не является подстрокой другого, вы должны использовать assertIn и assertNotIn:

# Passes
self.assertIn('bcd', 'abcde')

# AssertionError: 'bcd' unexpectedly found in 'abcde'
self.assertNotIn('bcd', 'abcde')

Они новы, поскольку Python 2.7 и Python 3.1

Ответ 3

Вы можете написать утверждение о ожидаемой части строки в другой строке с помощью простого assertTrue + в ключевом слове python:

self.assertTrue("expected_part_of_string" in my_longer_string)

Ответ 4

Создайте объект JSON с помощью json.dumps().

Затем сравните их с помощью assertEqual(result, your_json_dict)

import json

expected_dict = {"car":["toyota", "honda"]}
expected_dict_json = json.dumps(expected_dict)

self.assertEqual(result, expected_dict_json)

Ответ 5

Как упоминалось Ed I, assertIn, вероятно, является самым простым ответом на поиск одной строки в другой. Однако в этом вопросе говорится:

Я хочу убедиться, что мой result содержит хотя бы объект json (или строку), который я указал в качестве второго аргумента выше, то есть {"car": ["toyota","honda"]}

Поэтому я бы использовал несколько утверждений, чтобы полезные сообщения были получены при отказе - тесты должны быть поняты и сохранены в будущем, возможно, кем-то, кто не писал их изначально. Поэтому, предполагая, что мы находимся внутри django.test.TestCase:

# Check that 'car' is a key in 'result'
self.assertIn('car', result)
# Compare the 'car' to what expected (assuming that order matters)
self.assertEqual(result['car'], ['toyota', 'honda'])

Что дает полезные сообщения следующим образом:

# If 'car' isn't in the result:
AssertionError: 'car' not found in {'context': ..., 'etc':... }
# If 'car' entry doesn't match:
AssertionError: Lists differ: ['toyota', 'honda'] != ['honda', 'volvo']

First differing element 0:
toyota
honda

- ['toyota', 'honda']
+ ['honda', 'volvo']

Ответ 6

Я столкнулся с подобной проблемой, и я использовал атрибут rendered_content, поэтому я написал

assertTrue('string' in response.rendered_content) и аналогичным образом

assertFalse('string' in response.rendered_content) если я хочу проверить, что строка не отображается

Но он также работал на раннем предложенном методе,

AssertContains(response, 'html string as rendered')

Поэтому я бы сказал, что первый из них более прост. Надеюсь, это поможет.