私はassertEqual
、辞書で実行するときにassertDictEqual
呼び出されることを知っています。同様にassertEqual
、シーケンスでは が実行されますassertSequenceEqual
。
ただし、assertDictEqual
が値を比較するときは、 を使用していないように見えるため、assertEqual
呼び出さassertSequenceEqual
れません。
次の簡単な辞書を検討してください。
lst1 = [1, 2]
lst2 = [2, 1]
d1 = {'key': lst1}
d2 = {'key': lst2}
self.assertEqual(lst1, lst2) # True
self.assertEqual(d1, d2) # False ><
のようなセマンティクスを値に再帰的に適用することにより、等値が適切に比較されるなどのd1
辞書をテストするにはどうすればよいですか?d2
assertEqual
ネイティブの django 拡張機能でない限り、可能であれば外部モジュール (この質問で提案されているように) の使用を避けたいと考えています。
編集
基本的に、私が求めているのは、これの組み込みバージョンです。
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)
上記のコードの問題は、エラー メッセージが組み込みのアサートほど適切ではないことです。おそらく、無視したエッジ ケースが存在する可能性があります (頭のてっぺんから書いたように)。