为什么Pytest有时会报告两个dict不平等



问题

我在d1d2的两个字典之间进行了比较,看起来像这样:

{
    'id': 1,
    'name': 'Foo',
    'data': [
        OrderedDict(('name', 'bar'), ('id', 3)),
    ],
}

当我断言这两个词典相等时,主张有时会失败。让我得到的是以下代码通过:

for key in d1.keys():
    assert d1[key] == d2[key]

任何人都可以阐明为什么会发生这种情况,以及为什么它似乎是随机发生的?


可能的原因

我在这里真正要做的是测试Django REST框架的序列化器的输出。该数据并不总是作为普通字典返回,而是针对未预期的非巢输出工作的其他测试。

我还认为断言可能无法测试嵌套列表,但是以下没有错误:

d3 = {'data': d1['data']}
d4 = {'data': d2['data']}
assert d3 == d4

示例

我有两种型号FooBar。每个Bar均由Foo拥有。我有以下序列化:

class BarSerializer(serializers.ModelSerializer):
    class Meta:
        fields = ('id', 'name')
        model = Bar
class FooSerializer(serializers.ModelSerializer):
    bars = BarSerializer(many=True, read_only=True)
    class Meta:
        fields = ('id', 'name', 'bars')
        model = Foo

我正在尝试通过以下测试进行单元测试FooSerializer的输出:

# Assume my_foo_instance is an instance of Foo with one associated Bar
# instance. This should avoid any problems with the ordering of BarSerializer
# affecting the outcome.
serializer = FooSerializer(my_foo_instance)
bar_serializer = BarSerializer(my_foo_instance.bars.all(), many=True)
expected = {
    'id': my_foo_instance.id,
    'name': my_foo_instance.name,
    'bars': bar_serializer.data,
}
assert serializer.data == expected

正如我上面说的,主张有时失败。

因此,事实证明我没有提供足够的上下文来回答这个问题。我正在测试从另一个序列化器继承的序列化器,因此我没有手动构造测试中的所有字段,而是从基本序列化器中拉出了字段,然后用其他预期内容更新了该数据,例如:

>
base_serializer = BaseFooSerializer(foo)
additional = {
    'more': 'attributes',
    'of': 'foos',
}
expected = base_serializer.data.copy()
expected.update(additional)
assert foo_serializer.data == expected

由于DRF序列化器不返回标准的Python词典,所以我认为比较很奇怪。要解决它,我进行了以下更正:

expected = dict(base_serializer.data.items())

现在它可以正常工作。

相关内容

  • 没有找到相关文章

最新更新