我正在为我的登录程序创建测试。
在第一种情况下,如果我只希望 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();
}
}