Flutter test on provider with mockito

Viewed 342

I am creating test for my login procedures. in first case if I expect only ProcessState.loading my test get success, but to confirm the full process I need to add second approach ProcessState.error but it is giving me the error that I defined below.

C:\src\flutter\bin\flutter.bat --no-color test --machine --start-paused --plain-name "Login provider" test\provider_test\login_provider_state.dart

package:test_api                                    expectLater
package:flutter_test/src/widget_tester.dart 468:10  expectLater
test\provider_test\login_provider_state.dart 27:7   main.<fn>.<fn>
loginCall:: ProcessState.error

Expected: ProcessState:<ProcessState.error>
  Actual: ProcessState:<ProcessState.loading>

As you can see it's printing ProcessState.error, but not working. attaching my full code below.

Test section

class MockLoginRepository extends Mock implements LoginRepository {}

void main(){
  group('Login provider', (){
    LoginProvider loginProvider;
    MockLoginRepository repository;

setUp((){
  repository = MockLoginRepository();
  loginProvider = LoginProvider(repository);
});

test('login screen state test', () {
  loginProvider.emailController.text = 'mail@mailinator.com';
  loginProvider.passwordController.text = '12345678';

  loginProvider.loginCall();

  expect(loginProvider.state, ProcessState.loading);
  expectLater(loginProvider.state, ProcessState.error);
});

  });
}

Repository section

abstract class LoginRepository {
  Future<LoginResponse> loginCall(String email, String password);
}

Provider section

enum ProcessState {ideal, loading, loaded, error}

class LoginProvider extends ProviderState {
  final LoginRepository loginRepository;

  TextEditingController emailController = TextEditingController();
  TextEditingController passwordController = TextEditingController();

  LoginProvider(this.loginRepository);

  void loginCall() async {
    state = ProcessState.loading;

    LoginResponse response = await loginRepository.loginCall(
      emailController.text,
      passwordController.text,
    );

    if(response != null) {
      state = ProcessState.loaded;
      print('loginCall:: $state');
    } else {
      state = ProcessState.error;
      print('loginCall:: $state');
    }
  }
}

class ProviderState extends ChangeNotifier {
  ProcessState _state;

  ProcessState get state => _state;

  set state(ProcessState value) {
    _state = value;
    notifyListeners();
  }
}
0 Answers
Related