93

在 python 单元测试(实际上是 Django)中,正确的assert语句会告诉我我的测试结果是否包含我选择的字符串?

self.assertContainsTheString(result, {"car" : ["toyota","honda"]})

我想确保 myresult至少包含我指定为上面第二个参数的 json 对象(或字符串)

{"car" : ["toyota","honda"]}
4

5 回答 5

144

要断言一个字符串是否是另一个字符串的子字符串,您应该使用assertInand assertNotIn

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

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

这些是自Python 2.7Python 3.1以来的新功能

于 2016-03-15T20:07:14.033 回答
76
self.assertContains(result, "abcd")

您可以修改它以使用 json。

self.assertContains仅用于对象HttpResponse。对于其他对象,请使用self.assertIn.

于 2013-07-09T05:33:51.863 回答
26

您可以在 python 关键字中使用简单的 assertTrue + 在另一个字符串中编写关于字符串预期部分的断言:

self.assertTrue("expected_part_of_string" in my_longer_string)
于 2015-03-23T08:05:51.770 回答
10

使用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)
于 2013-07-08T22:20:45.547 回答
10

正如 Ed I 所提到的assertIn这可能是在另一个字符串中查找一个字符串的最简单的答案。但是,问题指出:

我想确保 myresult至少包含我指定为上面第二个参数的 json 对象(或字符串),即{"car" : ["toyota","honda"]}

因此,我将使用多个断言,以便在失败时收到有用的消息 - 将来必须理解和维护测试,可能由最初没有编写它们的人来理解和维护。因此,假设我们在 a 内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']
于 2016-03-25T13:14:15.587 回答