[Flutter] Riverpod(hooks riverpod)를 사용하여 Widget Test에서Provider의 쓰기 방법을 덮어쓰는 견본
컨디션
이 문장의 목적
공식 Docts의 Testing 페이지에 데이터 파일이widget 정의와Test를 하는 예가 쓰여 있지만 일반적인 경우 다른 파일로 많이 쓴다.
Riverpod에서는 테스트 시 Provider의 구현을 덮어쓸 수 있습니다.자기가 위젯 테스트를 쓸 때 착각해서 테스트가 통과하지 못하고 생각에 잠겼기 때문에 메모로 적어놨어요.
자기가 저지른 잘못
Widget Test에서는 Test를 쓰는 것과 같은 데이터 파일에 정의된 Provider를 호출하는 줄 알았지만, 결국
useProvider
등 파일의 Provider를 호출했다.[1] Widget 정의 및 Test 견본을 작성합니다.
여기서부터 샘플 코드를 쓰기 시작합니다.참고가 됐으면 좋겠어요.
state/auth/user/auth_state.dart
abstract class AuthState with _$AuthState {
const factory AuthState({
@Default(false) bool isAuthenticated
}) = _AuthState;
}
class AuthStateNotifier extends StateNotifier<AuthState> {
AuthStateNotifier() : super(const AuthState());
AuthStateNotifier.withDefaultValue({ bool isAuthenticated})
: super(AuthState(isAuthenticated: isAuthenticated));
set isAuthenticated(bool authenticationState) {
state = state.copyWith(isAuthenticated: authenticationState);
}
bool get isAuthenticated {
return state.isAuthenticated;
}
}
lib/middleware/auth_middleware.dartfinal authStateNotifierProvider =
StateNotifierProvider((_) => AuthStateNotifier());
class AuthMiddleWare extends HookWidget {
const AuthMiddleWare(this.amplifyApi);
final AmplifyApiInterface amplifyApi;
Widget build(BuildContext context) {
final authStateNotifier = useProvider(authStateNotifierProvider);
if (authStateNotifier.isAuthenticated) {
return HomeView();
} else {
return StartupView();
}
}
}
Test code는 바로 이런 느낌입니다.test/widget/middleware/auth_middleware_test.dart
void main() {
group('AuthMiddleware', () {
testWidgets('should go to HomeView Page when authenticated',
(WidgetTester tester) async {
await tester.pumpWidget(
ProviderScope(
// ここでProviderの実装を上書き。authStateNotifierProviderを呼ぶことに注意。
overrides: [
authStateNotifierProvider.overrideWithValue(
AuthStateNotifier.withDefaultValue(isAuthenticated: true),
),
],
child: MaterialApp(
home: AuthMiddleWare(),
),
),
);
expect(find.byType(HomeView), findsOneWidget);
});
});
}
각주곰곰이 생각해 보면 당연한 거야...↩︎
Reference
이 문제에 관하여([Flutter] Riverpod(hooks riverpod)를 사용하여 Widget Test에서Provider의 쓰기 방법을 덮어쓰는 견본), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/karayuu/articles/0b7ce0734000be텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)