首页 > 解决方案 > 如何在 Dart 单元测试中通过对象的状态(所有属性值)断言对象?

问题描述

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

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

import 'package:test/test.dart';

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

void main() {
  test("compare objects", () {
    final obj1 = UnderTesting(a:1, b:2);
    final obj2 = UnderTesting(a:1, b:2);
    
    // Next will fail because it is checking if it is the same instance
    expect(obj1, equals(obj2));
  } );
}

标签: dart

解决方案


==您需要hashCodeUnderTesting. 的文档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软件包: https ://pub.dev/documentation/quiver/latest/quiver.core/quiver.core-library.htmlhashCode


推荐阅读