我正在使用MackTail程序包.我在嘲笑WeatherRepository.所以我不太明白这个错误是什么.请查收附件中的以下代码

导入'package:weather_app/data/data_provider/weather_data_provider. dart'; 导入'package:weather_app/models/weather_model. dart';

存储库:

class WeatherRepository {
  final WeatherDataProvider weatherDataProvider;
  WeatherRepository(this.weatherDataProvider);

  Future<WeatherModel> getCurrentWeather(String cityName) async {
    try {
      final weatherData = await weatherDataProvider.getCurrentWeather(cityName);

      final data = jsonDecode(weatherData);

      if (data['cod'] != '200') {
        throw 'An unexpected error occurred';
      }

      return WeatherModel.fromMap(data);
    } catch (e) {
      throw e.toString();
    }
  }
}

测试:

import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:weather_app/bloc/weather_bloc.dart';
import 'package:weather_app/data/data_provider/weather_data_provider.dart';
import 'package:weather_app/data/repository/weather_repository.dart';
import 'package:weather_app/models/weather_model.dart';
import 'package:bloc_test/bloc_test.dart';

class MockWeatherRepository extends Mock implements WeatherRepository {}

void main() {
  late WeatherDataProvider mockweatherDataProvider;
  late WeatherRepository mockWeatherRepository;

  setUp(() {
    mockweatherDataProvider = WeatherDataProvider();
    mockWeatherRepository = WeatherRepository(mockweatherDataProvider);
  });

  String cityName = "New Delhi";
  WeatherModel weather = WeatherModel(
      currentTemp: 20.0,
      currentSky: 'Rain',
      currentPressure: 10,
      currentWindSpeed: 20.0,
      currentHumidity: 10);

  blocTest(
    'Get weather',
    build: () {
      when(() => mockWeatherRepository.getCurrentWeather(cityName))
          .thenAnswer((_) async => weather);

      return WeatherBloc(mockWeatherRepository);
    },
    act: (bloc) => bloc.add(WeatherFetched()),
    expect: () => [
      isA<WeatherLoading>(),
      isA<WeatherSuccess>()
    ],
  );
}

错误:

Bad state: No method stub was called from within `when()`. Was a real method called, or perhaps an extension method?
package:mocktail/src/mocktail.dart 262:7     When._completeWhen
package:mocktail/src/mocktail.dart 257:12    When.thenAnswer
test/bloc/weather_bloc_test.dart 55:12       main.<fn>
package:bloc_test/src/bloc_test.dart 203:25  testBloc.<fn>
===== asynchronous gap ===========================
dart:async                                   _Completer.completeError
package:bloc_test/src/bloc_test.dart 257:43  _runZonedGuarded.<fn>
===== asynchronous gap ===========================
dart:async                                   _CustomZone.registerBinaryCallback
package:bloc_test/src/bloc_test.dart 254:5   _runZonedGuarded.<fn>
dart:async                                   runZonedGuarded
package:bloc_test/src/bloc_test.dart 253:3   _runZonedGuarded
package:bloc_test/src/bloc_test.dart 200:11  testBloc
package:bloc_test/src/bloc_test.dart 156:13  blocTest.<fn>

推荐答案

问题出在mock WeatherReposi至ry分配:

late WeatherReposi至ry mockWeatherReposi至ry;
mockWeatherReposi至ry = WeatherReposi至ry(mockweatherDataProvider);

要将mock WeatherReposi至ry分配给WeatherReposi至ry的实例,而不是MockWeatherReposi至ry的实例.

When()不能调用存根方法getCurrentWeather.

试着换一件

mockWeatherReposi至ry = WeatherReposi至ry(mockweatherDataProvider);

mockWeatherReposi至ry = MockWeatherReposi至ry();

Flutter相关问答推荐

想更新ListView上的索引点击块Flutter

自定义ItemBuilderFlutter

相同的Flutter 代码库,但Firebase登录适用于Web应用程序,但无法登录iOS应用程序

在创建肘部并使用冻结时,无法使用中的Copy With方法

Flutter AppBar Animation反向调试

为什么在setState之后Ffltter Pageview重置为第0页

如何使文本表格域在抖动中变圆?

Flutter飞溅屏幕即使在修改后仍显示默认徽标和背景色

在flutter中从图库或相机中 Select 图像的方法

升级到 Flutter 3.10 后,Flutter 键盘填充不起作用. Flutter 3.10 如何防止 BottomSheet 被键盘覆盖?

Dart 撕掉 const 构造函数

更改 flutter listview 中的布局

在 flutter 中获取最喜欢的文档

我在手机上找不到我的 Flutter 应用缓存数据

有没有办法在没有收缩包装的情况下在列中使用 ListView.Builder?

Flutter - 我需要显示文本,但应用程序不需要

在 Flutter 中读取 Firebase 数据库数据时遇到问题

如何对齐卡片小部件中的图标按钮?

如何在 Flutter 中将 ScaffoldMessenger 中的 Snackbar 显示为 Widget?

Flutter:整个判断整个应用生命周期的通用类