我有一个脚本,可以使用原始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,但也许我遗漏了一些东西。有这种方法吗?我是否缺少某些内容?或者这真的是检查字段相等性的最佳方法吗?
答案 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)