我正在嘗試使用 bloc_test 庫進行單元測驗。
這是我的代碼。
登錄手肘
class LoginCubit extends Cubit<LoginState> with HydratedMixin {
final UserRepository _userRepository;
LoginCubit(this._userRepository) : super(LoginInitial());
Future<void> login (String email, String password , bool remember) async {
bool result = await _userRepository.isLoginCorrectWithEmailAndPassword(email, password);
if (result){
emit(LoggedIn(remember: remember, email: email));
} else {
emit(LoginError());
}
}
}
登錄狀態
part of 'login_cubit.dart';
@immutable
abstract class LoginState extends Equatable {}
class LoginInitial extends LoginState {
final bool remember;
final String email;
LoginInitial({this.remember = false, this.email = ''});
@override
List<Object?> get props => [remember, email];
}
class LoggedIn extends LoginState {
final bool remember;
final String email;
LoggedIn({required this.remember, required this.email});
@override
List<Object?> get props => [remember, email];
}
class LoginError extends LoginState {
LoginError();
@override
List<Object?> get props => [];
}
單元測驗
class MockUserRepository extends Mock implements UserRepository {
@override
Future<bool> isLoginCorrectWithEmailAndPassword(String email, String password) {
return Future.value(true);
}
}
void main() {
group('LoginCubit', () {
late LoginCubit loginCubit;
setUp(() {
loginCubit = LoginCubit(MockUserRepository());
});
tearDown(() {
loginCubit.close();
});
test('the initial state value is LoginInitial', () {
expect(loginCubit.state, LoginInitial());
});
blocTest<LoginCubit, LoginState>(
'TODO: description',
build: () => loginCubit,
act: (cubit) => cubit.login("any email", "any password", true),
expect: () => <LoginState>[
LoggedIn(remember: true, email: "any email"),
],
);
});
}
我的問題是第二個測驗總是回傳一個空陣列。通過一些列印,我確定代碼發出 LoggedIn 狀態,但測驗實際上無法識別它。
我在哪里做錯了?:)
uj5u.com熱心網友回復:
您忘記為存盤庫函式呼叫添加存根。
從 Mock 類創建一個物件
MockUserRepository repo = MockUserRepository();像這樣
LoginCubit將這個物件傳遞給setUp函式中的setUp(() { loginCubit = LoginCubit(repo); });將此行添加到
act測驗中的函式when(repo.isLoginCorrectWithEmailAndPassword(any, any)).thenAnswer((_) async => true);
所以整個測驗應該是這樣的
blocTest<LoginCubit, LoginState>(
'TODO: description',
build: () => loginCubit,
act: (cubit) {
when(repo.isLoginCorrectWithEmailAndPassword(any, any)).thenAnswer((_) async => true);
cubit.login("any email", "any password", true);
},
expect: () => <LoginState>[
LoggedIn(remember: true, email: "any email"),
],
);
uj5u.com熱心網友回復:
問題是我使用的是 Hydrated Bloc 而沒有在測驗中對其進行初始化。這是它的解決方案:https : //github.com/felangel/bloc/issues/2022#issuecomment-747918417
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/391807.html
下一篇:模擬問題:無法實體化類的代理:Microsoft.AspNetCore.Identity.UserManager`
