在Dart单元测试中,如何根据对象的状态(所有属性值)断言对象?
我有一个类(当然比示例中的属性更多) 如何编写下面的简单测试?我知道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将失败,因为它正在检查它是否是同一个实例
相同的匹配器进行了测试,但没有运气
导入“包: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需要更好的测试工具。