15

クラスのテストを書いているときに、興味深い単純な問題に遭遇しました。いくつかのリストを含む 2 つの辞書に DictEqual をアサートしたいと思います。しかし、このリストは同じ方法でソートされない可能性があります -> その結果、テストが失敗します

例:

def test_myobject_export_into_dictionary(self):
    obj = MyObject()
    resulting_dictionary = {
            'state': 2347,
            'neighbours': [1,2,3]
        }
    self.assertDictEqual(resulting_dictionary, obj.exportToDict())

リスト内の要素の順序に応じて、これは時々失敗します

FAIL: test_myobject_export_into_dictionary
------------------------------------
-  'neighbours': [1,2,3],
+  'neighbours': [1,3,2],

これを簡単な方法で主張する方法はありますか?

比較する前に、リストsetの代わりに使用したり、リストを並べ替えたりすることを考えていました。list

4

4 に答える 4

8

あなたはPyHamcrestを試すかもしれません (例は修正されました)

assert_that(obj.exportToDict(), has_entries(
                                    { 'state': 2347,
                                      'neighbours': contains_inanyorder(1,2,3) }))

(最初の値 2347 は、実際には暗黙のequal_toマッチャーでラップされます。)

于 2013-01-24T02:36:26.160 に答える
1

できるよ:

a = {i:sorted(j) if isinstance(j, list) else j for i,j in resulting_dictionary.iteritems()}
b = {i:sorted(j) if isinstance(j, list) else j for i,j in obj.exportToDict().iteritems()}
self.assertDictEqual(a, b)
于 2013-01-23T23:24:59.217 に答える
0

おそらく、2 つの要素を個別に確認できます。

obj_dict = obj.exportToDict()
self.assertEqual(resulting_dictionary['state'], obj_dict['state'])
self.assertCountEqual(resulting_dictionary['neighbours'], obj_dict['neighbours'])
于 2014-01-03T13:51:04.183 に答える
0

使用方法all

assert all( (k,v) in resulting_dictionary.iteritems() 
            for (k,v) in obj.exportToDict().iteritems() )

私はpy.testでこのようなものを使用していますが、うまくいくはずです。


コメンターは、注文がここで私を台無しにするだろうと指摘しました---十分に公平です...それなら、セットを使用するだけです。

于 2013-01-23T23:23:14.283 に答える