Tôi biết rằng, khi thực hiện assertEqual
trên từ điển, assertDictEqual
được gọi. Tương tự, assertEqual
theo trình tự sẽ thực hiện assertSequenceEqual
.Làm thế nào để đạt được assertDictEqual với assertSequenceEqual được áp dụng cho các giá trị
Tuy nhiên, khi assertDictEqual
đang so sánh các giá trị, có vẻ như không sử dụng số assertEqual
và do đó assertSequenceEqual
không được gọi.
Hãy xem xét các từ điển đơn giản sau đây:
lst1 = [1, 2]
lst2 = [2, 1]
d1 = {'key': lst1}
d2 = {'key': lst2}
self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><
Làm thế nào tôi có thể kiểm tra từ điển như d1
và d2
mà bình đẳng của họ là đúng cách so sánh, bởi đệ quy áp dụng assertEqual
-like ngữ nghĩa cho các giá trị?
Tôi muốn tránh sử dụng mô-đun bên ngoài (như được đề xuất in this question) nếu có thể, trừ khi chúng là tiện ích mở rộng django gốc.
EDIT
Về cơ bản, những gì tôi theo đuổi là tích hợp sẵn trong phiên bản này:
def assertDictEqualUnorderedValues(self, d1, d2):
for k,v1 in d1.iteritems():
if k not in d2:
self.fail('Key %s missing in %s'%(k, d2))
v2 = d2[k]
if isinstance(v1, Collections.iterable) and not isinstance(v1, basestring):
self.assertValuesEqual(v1, v2)
else:
self.assertEqual(v1, v2)
Vấn đề với mã trên là các thông báo lỗi là không đẹp như các khẳng định được xây dựng, và có lẽ các trường hợp cạnh tôi đã bỏ qua (như tôi vừa viết ra khỏi đầu của tôi).
Với mô-đun 'unittest', 'self.assertEqual (lst1, lst2)' không đúng -> 'AssertionError: Danh sách khác: [1, 2]! = [2, 1]'. – martineau
@martineau - lỗi của tôi; Tôi đã đọc sai phần đó của tài liệu. Tôi đang tìm kiếm một tương đương với 'assertItemsEqual' thay vì' assertSequenceEqual' – sapi
Vâng, nếu bạn tạo 'lst1' và' lst2' giống như vậy thì 'assertEqual' đầu tiên thành công, thì cái thứ hai cũng sẽ thành công. – martineau