如何使用网络相关存储库对 bloc 进行单元测试?

How to unit test bloc with network relative repostitory?

我创建了一个 bloc 调用 Authentication。这个 bloc 发出两个状态调用 AutenticatedUnAuthenticated 基于 AuthenticationRepository 哪个依赖注入到 bloc.

然后我尝试为单元测试创​​建一个模拟的 MockAuthenticationRepository 但我有两个不同的状态所以我必须创建两个不同版本的存储库如 MockAutenticatedAuthenticationRepositoryMockUnAuthenticatedAuthenticationRepository 来测试这两种情况。

但也许有另一个集团基于存储库发出 5 或 6 个状态,然后我必须为其创建 5 到 6 个模拟存储库。这听起来并没有大错特错,因为一个集团不会无限增长。但我仍在寻找更好的方法来解决这个问题。有人有更好的主意吗?

您可以使用包 mocktail (https://pub.dev/packages/mocktail) 来设置存储库的正确行为。 使用包 bloc_test (https://pub.dev/packages/bloc_test) 来实现 bloc 单元测试也是一个好主意。

import 'package:mocktail/mocktail.dart';

class MockAutenticatedAuthenticationRepository extends Mock implements AutenticatedAuthenticationRepository {};

void main() {
  late MockAutenticatedAuthenticationRepository authMock;
  late AuthBloc bloc;

  setUp(() {
    authMock = MockAutenticatedAuthenticationRepository();
    bloc = AuthBloc(auchRepository: authMock);
  });


 blocTest(
      'should emit [AuthLoadingState, AuthSuccessState] when login data is correct',
      build: () {
        when(() => authMock.doAuth(any())).thenAnswer((_) async => true);
        return bloc;
      },
      act: (dynamic b) => b.add(AuthEvent.login("username","password")),
      expect: () => [AuthState.loading(), AuthState.success()],
    );

   blocTest(
      'should emit [AuthLoadingState, AuthFailureState] when login data is incorrect',
      build: () {
        when(() => authMock.doAuth(any())).thenAnswer((_) async => false);
        return bloc;
      },
      act: (dynamic b) => b.add(AuthEvent.login("username","wrong password")),
      expect: () => [AuthState.loading(), AuthState.failure()],
    );
}

您必须调整方法调用等,因为我没有您的示例代码。但我认为这应该可以帮助您解决问题。