Dart / Flutter测试肘,比较预期和实际的问题
Posted
技术标签:
【中文标题】Dart / Flutter测试肘,比较预期和实际的问题【英文标题】:Dart / Flutter test cubit, problem with comparing expected and actual 【发布时间】:2021-07-27 22:48:33 【问题描述】:我正在使用 WeatherAPI 开发一个应用程序。我目前无法实施一些工作测试。我尝试遵循 ResoCoders 指南 (https://resocoder.com/2019/11/29/bloc-test-tutorial-easier-way-to-test-blocs-in-dart-flutter/) 并实际实现了所有状态、块(我使用 Cubit 代替)、类、函数……几乎相同。
这是我的测试代码:
blocTest<WeatherCubit, WeatherBaseState>(
'Cubit emits WeatherLoaded',
build: ()
return WeatherCubit(weatherRepository: mockWeatherRepository);
,
act: (WeatherCubit cubit) => cubit.getWeather(),
expect: () => [
WeatherLoaded(
temperature: temperature,
...
lat: lat,
lon: lon)
],
);
这是我从调试控制台得到的错误消息:
Expected: [Instance of 'WeatherLoaded']
Actual: [Instance of 'WeatherLoaded']
Which: at location [0] is <Instance of 'WeatherLoaded'> instead of <Instance of 'WeatherLoaded'>
WARNING: Please ensure state instances extend Equatable, override == and hashCode, or implement Comparable.
Alternatively, consider using Matchers in the expect of the blocTest rather than concrete state instances.
我尝试使用 Matcher,但不完全了解如何使用它。
如果问题出在此处,我的 WeatherCubit 实现:
class WeatherCubit extends Cubit<WeatherBaseState>
final IWeatherRepository weatherRepository; //IWeatherRepository is interface
WeatherCubit(required this.weatherRepository)
: super(LoadingWeather()); // I use LoadingWeather as initial state
Future<void> getWeather() async
final Position location = await weatherRepository.determinePosition();
final WeatherData data = await weatherRepository.getWeather(
lat: location.latitude,
lon: location.longitude);
final WeatherLoaded weatherLoaded = WeatherLoaded(
temperature: data.temperature,
...
lat: data.lat,
lon: data.lon);
emit(weatherLoaded);
【问题讨论】:
【参考方案1】:如果您尝试测试类型,可以使用isA 匹配器。
expect: () => [isA<WeatherLoaded>()];
如果您尝试比较返回对象的值,您需要使用 Equatable 包,或手动覆盖 Cubit 中的 hashCode 和 == 运算符。
【讨论】:
谢谢!实际上,WeatherLoaded 实现了与 ResoCoder 示例中一样的 Equatable。但是我需要改变什么?我想测试一下 State 是否创建正确。 当你扩展 Equatable 时,你必须重写 props getter 并将所有类变量放在列表中。 ``` @override List 它是由 Equatable 自动生成的,所以我已经有了。那不可能是问题。@override List<Object?> get props => [ lat, lon, temperature, ... ];
@override bool? get stringify => true;
@Naddle 你找到解决方案了吗?我收到了同样的信息。
@PaulPérez 不幸的是,我没有。以上是关于Dart / Flutter测试肘,比较预期和实际的问题的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 测试失败,单元测试预期和实际状态对象相同但仍然失败