代码之家  ›  专栏  ›  技术社区  ›  l0b0

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

  •  0
  • l0b0  · 技术社区  · 6 年前

    我通过在遗留数据库中创建行、运行导入并验证是否将正确的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 回复  |  直到 6 年前
        1
  •  1
  •   schillingt    6 年前

    _meta.fields __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)