Dart / Flutter测试肘,比较预期和实际的问题

Posted

技术标签:

【中文标题】Dart / Flutter测试肘,比较预期和实际的问题【英文标题】:Dart / Flutter test cubit, problem with comparing expected and actual 【发布时间】:2021-07-27 22:48:33 【问题描述】:

我正在使用 Wea​​therAPI 开发一个应用程序。我目前无法实施一些工作测试。我尝试遵循 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&lt;Object?&gt; get props =&gt; [ lat, lon, temperature, ... ];@override bool? get stringify =&gt; true; @Naddle 你找到解决方案了吗?我收到了同样的信息。 @PaulPérez 不幸的是,我没有。

以上是关于Dart / Flutter测试肘,比较预期和实际的问题的主要内容,如果未能解决你的问题,请参考以下文章

Flutter 测试失败,单元测试预期和实际状态对象相同但仍然失败

Flutter 测试的最新进展

在 Flutter/Dart 中从字节加载图像的问题

如何从 Dart VM / Dart 集成测试访问 Firebase Firestore?

Flutter应用冻结并且无法按预期工作

如何在 Dart/Flutter 上的测试中导入测试实用程序文件