如何使用网络相关存储库对 bloc 进行单元测试?
How to unit test bloc with network relative repostitory?
我创建了一个 bloc 调用 Authentication
。这个 bloc 发出两个状态调用 Autenticated
和 UnAuthenticated
基于 AuthenticationRepository
哪个依赖注入到 bloc.
然后我尝试为单元测试创建一个模拟的 MockAuthenticationRepository
但我有两个不同的状态所以我必须创建两个不同版本的存储库如 MockAutenticatedAuthenticationRepository
和 MockUnAuthenticatedAuthenticationRepository
来测试这两种情况。
但也许有另一个集团基于存储库发出 5 或 6 个状态,然后我必须为其创建 5 到 6 个模拟存储库。这听起来并没有大错特错,因为一个集团不会无限增长。但我仍在寻找更好的方法来解决这个问题。有人有更好的主意吗?
您可以使用包 mocktail (https://pub.dev/packages/mocktail) 来设置存储库的正确行为。
使用包 bloc_test (https://pub.dev/packages/bloc_test) 来实现 bloc 单元测试也是一个好主意。
import 'package:mocktail/mocktail.dart';
class MockAutenticatedAuthenticationRepository extends Mock implements AutenticatedAuthenticationRepository {};
void main() {
late MockAutenticatedAuthenticationRepository authMock;
late AuthBloc bloc;
setUp(() {
authMock = MockAutenticatedAuthenticationRepository();
bloc = AuthBloc(auchRepository: authMock);
});
blocTest(
'should emit [AuthLoadingState, AuthSuccessState] when login data is correct',
build: () {
when(() => authMock.doAuth(any())).thenAnswer((_) async => true);
return bloc;
},
act: (dynamic b) => b.add(AuthEvent.login("username","password")),
expect: () => [AuthState.loading(), AuthState.success()],
);
blocTest(
'should emit [AuthLoadingState, AuthFailureState] when login data is incorrect',
build: () {
when(() => authMock.doAuth(any())).thenAnswer((_) async => false);
return bloc;
},
act: (dynamic b) => b.add(AuthEvent.login("username","wrong password")),
expect: () => [AuthState.loading(), AuthState.failure()],
);
}
您必须调整方法调用等,因为我没有您的示例代码。但我认为这应该可以帮助您解决问题。
我创建了一个 bloc 调用 Authentication
。这个 bloc 发出两个状态调用 Autenticated
和 UnAuthenticated
基于 AuthenticationRepository
哪个依赖注入到 bloc.
然后我尝试为单元测试创建一个模拟的 MockAuthenticationRepository
但我有两个不同的状态所以我必须创建两个不同版本的存储库如 MockAutenticatedAuthenticationRepository
和 MockUnAuthenticatedAuthenticationRepository
来测试这两种情况。
但也许有另一个集团基于存储库发出 5 或 6 个状态,然后我必须为其创建 5 到 6 个模拟存储库。这听起来并没有大错特错,因为一个集团不会无限增长。但我仍在寻找更好的方法来解决这个问题。有人有更好的主意吗?
您可以使用包 mocktail (https://pub.dev/packages/mocktail) 来设置存储库的正确行为。 使用包 bloc_test (https://pub.dev/packages/bloc_test) 来实现 bloc 单元测试也是一个好主意。
import 'package:mocktail/mocktail.dart';
class MockAutenticatedAuthenticationRepository extends Mock implements AutenticatedAuthenticationRepository {};
void main() {
late MockAutenticatedAuthenticationRepository authMock;
late AuthBloc bloc;
setUp(() {
authMock = MockAutenticatedAuthenticationRepository();
bloc = AuthBloc(auchRepository: authMock);
});
blocTest(
'should emit [AuthLoadingState, AuthSuccessState] when login data is correct',
build: () {
when(() => authMock.doAuth(any())).thenAnswer((_) async => true);
return bloc;
},
act: (dynamic b) => b.add(AuthEvent.login("username","password")),
expect: () => [AuthState.loading(), AuthState.success()],
);
blocTest(
'should emit [AuthLoadingState, AuthFailureState] when login data is incorrect',
build: () {
when(() => authMock.doAuth(any())).thenAnswer((_) async => false);
return bloc;
},
act: (dynamic b) => b.add(AuthEvent.login("username","wrong password")),
expect: () => [AuthState.loading(), AuthState.failure()],
);
}
您必须调整方法调用等,因为我没有您的示例代码。但我认为这应该可以帮助您解决问题。