如何在测试中检查自定义Django模型实例的相等性?

时间:2019-01-17 21:40:48

标签: django

我有一个脚本,可以使用原始SQL将旧数据库中的数百万条记录导入到Django数据库中,以提高效率。旧版数据库没有ID主键,因此这些主键是在插入行时根据序列创建的。

我正在测试导入过程是否正常,方法是在旧数据库中创建行,运行导入并验证是否可以取出正确的Django对象。测试的最后一部分通常看起来像这样:

actual = MyModel.objects.get(code=legacy_object_code)
expected = MyModel(
    id=actual.id,
    code=legacy_object_code,
    other_property=other_value,
    …
)

我必须从实际对象中提取ID,因为否则无法对两个对象进行相等性测试。但是问题是self.assertEqual(expected, actual)总是成功!这是因为Django object equality被定义为具有相同的类型和ID / PK。

我实际检查模型实例属性的解决方法是:

def assert_model_instance_field_equality(self, expected, actual):
    expected_dict = expected.__dict__
    expected_dict.pop('_state')
    actual_dict = actual.__dict__
    actual_dict.pop('_state')
    self.assertDictEqual(expected_dict, actual_dict)

我找不到这种assertion method,但也许我遗漏了一些东西。有这种方法吗?我是否缺少某些内容?或者这真的是检查字段相等性的最佳方法吗?

1 个答案:

答案 0 :(得分:1)

我建议您使用a hash in a special format属性,而不要使用__dict__

def assert_model_instance_fields_equal(self, model, expected, actual):
    for field_name in model._meta.get_fields()
        expected_value = getattr(expected, field_name)
        actual_value = getattr(actual, field_name)
        self.assertEqual(expected_value, actual_value)