程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在 Flutter 中的 Bloc 中测试 API 调用大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决在 Flutter 中的 Bloc 中测试 API 调用?

开发过程中遇到在 Flutter 中的 Bloc 中测试 API 调用的问题如何解决?下面主要结合日常开发的经验,给出你关于在 Flutter 中的 Bloc 中测试 API 调用的解决方法建议,希望对你解决在 Flutter 中的 Bloc 中测试 API 调用有所启发或帮助;

我第一次尝试为 Bloc 编写测试, 在这里我面临的问题是:

NoSuchMethodError: The method 'fetchPlayerTologin' was called on null.
Receiver: null
TrIEd calling: fetchPlayerTologin("test.m98@gmail.com","test123!")
dart:core                                    Object.noSuchMethod
test/login_bloc_test.dart 31:35              main.<fn>.<fn>
package:bloc_test/src/bloc_test.dart 160:26  runBlocTest.<fn>
package:bloc_test/src/bloc_test.dart 158:5   runBlocTest.<fn>
dart:async                                   runZoned
package:bloc_test/src/bloc_test.dart 157:9   runBlocTest
package:bloc_test/src/bloc_test.dart 127:11  blocTest.<fn>
package:bloc_test/src/bloc_test.dart 126:26  blocTest.<fn>
===== asynchronous gap ===========================
dart:async                                   _completeOnAsyncError
package:bloc_test/src/bloc_test.dart         runBlocTest.<fn>
package:bloc_test/src/bloc_test.dart 158:5   runBlocTest.<fn>
dart:async                                   runZoned
package:bloc_test/src/bloc_test.dart 157:9   runBlocTest
package:bloc_test/src/bloc_test.dart 127:11  blocTest.<fn>
package:bloc_test/src/bloc_test.dart 126:26  blocTest.<fn>

但是用户存在于数据库中,您知道问题出在哪里吗?

这是我的整体测试

class mockPlayerRepository extends mock implements PlayerRepository {}

voID main() {
  mockPlayerRepository mockPlayerRepository;

  setUp() {
    mockPlayerRepository = mockPlayerRepository();
  }

    blocTest(
      'Login button pressed',build: () {
        when(mockPlayerRepository.fetchPlayerTologin(
                'test.m98@gmail.com','test123!'))
            .thenAnswer((_) async => player);
        return LoginBloc(repository: mockPlayerRepository);
      },act: (bloC) => bloc.add(const LoginEvent.loginbutton()),expect: [
        LoginState(
            email: EmailAddress('test.m98@gmail.com'),password: password('test123!'),isLoading: falsE),LoginState(
            email: EmailAddress('test.m98@gmail.com'),isLoading: truE),],);
  });
}

我的集团是

class LoginBloc extends Bloc<LoginEvent,LoginState> {
  final PlayerRepository repository;
  // ignore: sort_constructors_first
  LoginBloc({@required this.repository})
      : assert(repository != null),super(LoginState.initial());

  @overrIDe
  Stream<LoginState> mapEventToState(
    LoginEvent event,) async* {
    yIEld* event.map(emailChanged: (E) async* {
      yIEld state.copyWith(
        email: EmailAddress(e.email),);
    },passwordChanged: (E) async* {
      yIEld state.copyWith(
        password: password(e.password),loginbutton: (E) async* {
      yIEld state.copyWith(isLoading: truE);
      if (state.email.isValID() && state.password.isValID()) {
        final String email = unpack(state.email.value.toIterable().toString());
        final String password =
            unpack(state.password.value.toIterable().toString());

        final Player player =
            await repository.fetchPlayerTologin(email,password);

        yIEld state.copyWith(
          player: player,isLoading: false,);
      }
    });
  }
}

使用邮递员检查API调用工作完美,函数本身是

class PlayerRepository extends PlayerAPIProvIDer {
  // fetchPlayerTologin function required to return player if login and password are correct and null if any error occurs
  Future<Player> fetchPlayerTologin(String email,String password) async =>
      await login(email,password);
}





class PlayerAPIProvIDer {
  //Function for user to Login
  Future<Player> login(String email,String password) async {
    try {
      final http.Response response = await http.patch(
        '$octollengeURL/login',headers: <String,String>{
          'Content-Type': 'application/Json','Accept-EnCoding': 'application/Json',},body: JsonEncode(<String,String>{
          'email': email,'password': password,}),);

      if (response.statusCode == 200) {
        return Player.fromJson(response.body);
      } else if (response.statusCode == 400) {
        showSnack('User is not registered',errcolor,colors.whitE);
        return null;
      } else if (response.statusCode == 403) {
        showSnack('password is incorrect',colors.whitE);
        return null;
      } else {
        showSnack('Server error with status code : ${response.statusCodE}',colors.whitE);
        return null;
      }
    } on SocketException {
      showSnack('No internet Connection',colors.whitE);
      return null;
    } on httpException {
      showSnack(
          'Think we have troubles on server sIDe',colors.whitE);
      return null;
    } on FormatException {
      showSnack(
          'You got bad response format,try again',colors.whitE);
      return null;
    } catch (E) {
      logger.e(e.toString());
      showSnack(
          'Think we have troubles on server sIDe',colors.whitE);
      return null;
    }
  }
}

用于将函数的输入更改为'any'关键字但仍然存在相同问题 如果您需要更多信息,我可以提供

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的在 Flutter 中的 Bloc 中测试 API 调用全部内容,希望文章能够帮你解决在 Flutter 中的 Bloc 中测试 API 调用所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。