在python单元测试(实际上是Django)中,什么assert
能告诉我测试结果是否包含我选择的字符串的正确陈述是什么?
self.assertContainsTheString(result, {"car" : ["toyota","honda"]})
我想确保我result
至少包含我指定为上面第二个参数的json对象(或字符串)
{"car" : ["toyota","honda"]}
Answers:
self.assertContains(result, "abcd")
您可以修改它以使用json。
使用self.assertContains
只为HttpResponse
对象。对于其他对象,请使用self.assertIn
。
要断言一个字符串是否是另一个字符串的子字符串,应使用assertIn
和assertNotIn
:
# Passes
self.assertIn('bcd', 'abcde')
# AssertionError: 'bcd' unexpectedly found in 'abcde'
self.assertNotIn('bcd', 'abcde')
这些是自Python 2.7和Python 3.1以来的新功能
assertIn
正如您所说明的,还提供有关故障的有用消息。
您可以使用简单的assertTrue + in python关键字在另一个字符串中编写有关字符串的预期部分的声明:
self.assertTrue("expected_part_of_string" in my_longer_string)
使用构建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)
dumps()
使用任意顺序,并且我们不知道中的键顺序result
。使用会更好self.assertEqual(json.loads(result), expected_dict)
。
如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's 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']
我发现自己在一个类似的问题,我使用的属性rendered_content,所以我写了
assertTrue('string' in response.rendered_content)
同样
assertFalse('string' in response.rendered_content)
如果我想测试未呈现字符串
但这也适用于早期建议的方法,
AssertContains(response, 'html string as rendered')
所以我想说第一个比较简单。希望对您有所帮助。