在Dart单元测试中,如何根据对象的状态(所有属性值)断言对象?

在Dart单元测试中,如何根据对象的状态(所有属性值)断言对象?,dart,Dart,我有一个类(当然比示例中的属性更多) 如何编写下面的简单测试?我知道Dart中的相等是通过对象实例实现的。如何比较完整的对象状态?我也用相同的匹配器进行了测试,但没有运气 导入“包:test/test.dart”; 类欠测{ var a; var b; 测试不足({this.a,this.b}); } void main(){ 测试(“比较对象”,(){ 最终obj1=测试不足(a:1,b:2); 最终obj2=测试不足(a:1,b:2); //Next将失败,因为它正在检查它是否是同一个实例

我有一个类(当然比示例中的属性更多)

如何编写下面的简单测试?我知道Dart中的相等是通过对象实例实现的。如何比较完整的对象状态?我也用
相同的
匹配器进行了测试,但没有运气

导入“包:test/test.dart”;
类欠测{
var a;
var b;
测试不足({this.a,this.b});
}
void main(){
测试(“比较对象”,(){
最终obj1=测试不足(a:1,b:2);
最终obj2=测试不足(a:1,b:2);
//Next将失败,因为它正在检查它是否是同一个实例
expect(obj1,等于(obj2));
} );
}

您需要覆盖
=
操作符(因此也应该覆盖
hashCode
)以进行
欠测试。
equals
的文档告诉我们如何进行平等性测试:

如果[expected]是[Matcher],那么它将使用该匹配器进行匹配。否则,它将使用预期值上的
=
测试是否相等

所以你的代码应该是这样的:

import 'package:test/test.dart';
import 'package:quiver/core.dart';

class UnderTesting {
  int a;
  int b;
  UnderTesting({this.a, this.b});

  @override
  bool operator ==(Object other) =>
      (other is UnderTesting) ? (a == other.a && b == other.b) : false;

  @override
  int get hashCode => hash2(a, b);
}

void main() {
  test("compare objects", () {
    final obj1 = UnderTesting(a: 1, b: 2);
    final obj2 = UnderTesting(a: 1, b: 2);

    expect(obj1, equals(obj2)); // All tests passed!
  });
}

我可以推荐使用
quiver
包来简化
hashCode
实现:

我希望有一个特定的匹配器来比较类状态。我不喜欢在我所有的模型类中只做测试。另外,我不喜欢仅仅因为测试而修改生产类。事实上,我关心的是这些类被Flutter使用时的副作用。理论上,你可以用dart:mirrors做一些技巧,但最终,你应该让对象指定相等的含义,因为有时候,它不仅仅是在二进制级别检查对象的内部状态那么简单。我想说的是,对于模型数据,您应该始终覆盖
=
hashCode
(因此,如果内部私有状态不重要,您可以忽略它)。如果你担心这会打乱生产,你对平等的含义有不同的看法。在这种情况下,您应该在测试代码中编写特定的测试方法来比较对象。标记为正确答案,但我不喜欢这种测试方法。Dart需要更好的测试工具。