使用 mockito 对提供程序进行 Flutter 测试

时间:2021-04-17 12:03:11

标签: flutter unit-testing mockito

我正在为我的登录程序创建测试。 在第一种情况下,如果我只希望 ProcessState.loading 我的测试成功,但为了确认整个过程,我需要添加第二种方法 ProcessState.error 但它给了我下面定义的错误。

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>

如您所见,它正在打印 ProcessState.error,但不起作用。 在下面附上我的完整代码。

测试部分

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);
});

  });
}

仓库部分

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

提供者部分

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 个答案:

没有答案
相关问题