-1

这是我第一次尝试测试我的Cubit课程,所以请耐心等待,因为我在尝试了几个小时后完全没有想法。

我正在尝试测试一个看起来像这样的简单肘部:

@injectable
class ResetPasswordCubit extends Cubit<ResetPasswordState> {

  ResetPasswordCubit() : super(ResetPasswordInitial());

  void attemptPasswordReset({required ResetPasswordParams params}) async {
    emit(ResetPasswordLoading());
    emit(ResetPasswordLoaded());
  }
}

我要做的就是验证这两个状态是否按顺序发出。根据文档,有几种方法可以做到这一点,但我什至不确定应该使用哪一种。我更喜欢使用单元测试,虽然我都试过了。这是我所拥有的:

class MockResetPasswordCubit extends MockCubit<ResetPasswordState>
    implements ResetPasswordCubit {}

@GenerateMocks([ResetPassword])
void main() {
  late MockResetPassword mockResetPassword;
  late MockResetPasswordCubit cubit;
  late ResetPasswordParams params;

  setUp(() {
    mockResetPassword = MockResetPassword();
    cubit = MockResetPasswordCubit();
    params = const ResetPasswordParams(
        pin: "1234", password: "hello", confirmPassword: "hello");
    when(mockResetPassword.call(params))
        .thenAnswer((_) async => const Right(ResetPasswordResult.validated));
  });

  blocTest<ResetPasswordCubit, ResetPasswordState>(
      'when attempt to validate password is made then loading state is emitted',
      build: () => cubit,
      act: (cubit) => cubit.attemptPasswordReset(params: params),
      expect: () => [ResetPasswordLoading(), ResetPasswordLoaded()]);
}

这是显示的错误:

预期:['ResetPasswordLoading' 实例,'ResetPasswordLoaded' 实例]
实际:[]
其中:位置 [0] 是 [],比预期短

我真的没有想法,所以希望有人能纠正我。谢谢。

4

1 回答 1

0

似乎您正在尝试测试,ResetPasswordCubit但您所做的是模拟它,因此无法测试实际肘部的行为。

只是不要模拟您要测试的cubit并创建它的实例:

blocTest<ResetPasswordCubit, ResetPasswordState>(
  'when attempt to validate password is made then loading state is emitted',
  build: () => ResetPasswordCubit(), // <-- Creating an instance of Cubit
  act: (cubit) => cubit.attemptPasswordReset(params: params),
  expect: () => [ResetPasswordLoading(), ResetPasswordLoaded()],
);
于 2022-02-21T22:21:01.393 回答