unit-testing - 单元测试失败,断言失败:第 17 行:'':不正确
问题描述
我坚持进行单元测试并且对测试相当陌生。我尝试使用 toMap/fromMap 方法为类创建测试并为其编写测试。
在类中,我有以下代码,其中我添加了 hashCode 和 == 运算符方法来为测试准备类。
对于测试有效的其他类,我有完全相同的设置..
String uid;
String email;
String userName;
String diagnose;
bool surgery;
List<Goal> goals;
List<KOS> kos;
UserCase({
this.uid,
this.email,
this.userName,
this.diagnose,
this.surgery = false,
this.goals,
this.kos,
});
factory UserCase.fromData(Map<String, dynamic> data) {
if (data == null) {
print('UserCase fromData NULL');
return null;
}
final String uid = data['uid'] ?? '';
final String email = data['email'] ?? '';
final String userName = data['userName'] ?? '';
final String diagnose = data['diagnose'] ?? '';
final bool surgery = data['surgery'] ?? false;
final List<Goal> goals = data['goals'] == null
? []
: List.from(data['goals'].map((e) => Goal.fromData(e)));
final List<KOS> kos = data['kos'] == null
? []
: List.from(data['kos'].map((e) => KOS.fromData(e)));
return UserCase(
uid: uid,
email: email,
userName: userName,
diagnose: diagnose,
surgery: surgery,
goals: goals,
kos: kos,
);
}
Map<String, dynamic> toMap() {
return {
'uid': uid,
'email': email,
'userName': userName,
'diagnose': diagnose,
'surgery': surgery,
'goals': goals == null || goals.isEmpty
? []
: goals.map((e) => e.toMap()).toList(),
'kos':
kos == null || kos.isEmpty ? [] : kos.map((e) => e.toMap()).toList(),
};
}
**UPDATE: adding hashList to ListObjects**
@override
int get hashCode => hashValues(
uid, email, userName, diagnose, surgery, hashList(goals), hashList(kos));
old:
*@override
int get hashCode {
return hashValues(uid, email, userName, diagnose, surgery, goals, kos);
}*
@override
bool operator ==(other) {
if (identical(this, other)) return true;
if (runtimeType != other.runtimeType) return false;
final UserCase otherCase = other;
return uid == otherCase.uid &&
email == otherCase.email &&
userName == otherCase.userName &&
diagnose == otherCase.diagnose &&
surgery == otherCase.surgery &&
goals == otherCase.goals &&
kos == otherCase.kos;
}
}
这是失败的测试:
final userCase = UserCase.fromData({
'uid': 'id123',
'email': 'email123',
'userName': 'username',
'diagnose': 'ACL',
'surgery': true,
'goals': [],
'kos': [],
});
expect(
userCase,
UserCase(
uid: 'id123',
email: 'email123',
userName: 'username',
diagnose: 'ACL',
surgery: true,
goals: [],
kos: [],
));
});
**添加 hashList 后更新的错误消息**
test/usercase_test.dart: fromData case with all properties [E]
Expected: UserCase:<uid: id123, email: email123, userName: username, diagnose: ACL, surgery: true, goals: [], kos: []>
Actual: UserCase:<uid: id123, email: email123, userName: username, diagnose: ACL, surgery: true, goals: [], kos: []>
package:test_api expect
package:flutter_test/src/widget_tester.dart 431:3 expect
usercase_test.dart 21:7 main.<fn>.<fn>```
这就是错误消息 - 在将 hashList 方法添加到列表属性之后,这个现在更改为上面的那个。
.../test/usercase_test.dart: fromData case with all properties [E]
'dart:ui/hash_codes.dart': Failed assertion: line 17: '<optimized out>': is not true.
dart:ui hashValues
../lib/Classes/UserCase.dart 71:12 UserCase.hashCode
dart:collection _CompactLinkedHashSet.contains
package:matcher/src/pretty_print.dart 28:14 prettyPrint._prettyPrint
package:matcher/src/pretty_print.dart 119:22 prettyPrint
package:matcher/src/description.dart 49:11 StringDescription.addDescriptionOf
package:matcher/src/equals_matcher.dart 267:19 _DeepMatcher.describe
package:matcher/src/description.dart 47:13 StringDescription.addDescriptionOf
package:test_api expect
package:flutter_test/src/widget_tester.dart 431:3 expect
usercase_test.dart 22:7 main.<fn>.<fn>´´´
解决方案
我看不到任何明显的迹象表明哪个属性导致测试失败。
几个建议:
- 尝试从 == 实现中的比较中一次删除一个属性。
- 尝试为您的模型类使用Equatable 包。
==
这大大减少了样板文件,并且比hashCode
手动实施更不容易出错。