辞書にassertEqual
を実行すると、assertDictEqual
が呼び出されます。同様に、配列上のassertEqual
はassertSequenceEqual
を実行します。assertDictEqualを達成する方法値に適用される
ただし、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 ><
にはどうすれば再帰的な値にassertEqual
様セマンティクスを適用することにより、このようd1
とその平等が正しく比較されるようにd2
などの辞書をテストすることができますか?
ネイティブのdjango拡張でない限り、可能であれば外部モジュール(推奨のin this question)を使用しないでください。
基本的に、私は後にしていますが、このバージョンで構築されたEDIT
:上記のコードの問題は、エラーメッセージがほど良くないということである
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)
(私が頭の上から書いたように)私は無視してしまったかもしれない事例があります。
'unittest'モジュールで、' self.assertEqual(lst1、lst2) 'はTrueではありません - >' AssertionError:リストは異なります:[1、2]!= [2、1] '。 – martineau
@martineau - 私の間違い;私はドキュメントのその部分を誤解しました。 assertSequenceEqualではなくassertItemsEqualを探しています – sapi
'lst1'と' lst2'を同じようにして最初の 'assertEqual'が成功すれば、2番目も成功します。 – martineau