Flutter中Mock Supabase进行单元测试的方法及类型报错解决
解决Flutter中Supabase单元测试的Null类型错误
你遇到的错误是因为MockSupabaseClient默认未对auth属性做mock处理,调用client.auth时返回了null,而代码期望的是GoTrueClient类型,因此抛出类型不匹配异常。以下是完整的修复方案:
步骤1:Mock依赖的Supabase子组件
由于SupabaseClient的auth属性是GoTrueClient类型,需要额外创建该类的Mock实现:
class MockGoTrueClient extends Mock implements GoTrueClient {} class MockAuthResponse extends Mock implements AuthResponse {}
步骤2:配置Mock对象的关联关系
在测试初始化阶段,需要将MockSupabaseClient的auth属性指向mock的GoTrueClient,同时mocksignInWithPassword方法的返回值:
import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/mockito.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; class TestMClass { SupabaseClient client; TestMClass({ required this.client, }); Future<AuthResponse> signinMc() async { final response = await client.auth .signInWithPassword(email: 'example@gmail', password: 'password'); return response; } } class MockSupabaseClient extends Mock implements SupabaseClient {} class MockGoTrueClient extends Mock implements GoTrueClient {} class MockAuthResponse extends Mock implements AuthResponse {} void main() { late MockSupabaseClient mockClient; late MockGoTrueClient mockGoTrueClient; late TestMClass testMClass; setUp(() { // 初始化所有mock实例 mockGoTrueClient = MockGoTrueClient(); mockClient = MockSupabaseClient(); // 关联SupabaseClient的auth属性到mock的GoTrueClient when(mockClient.auth).thenReturn(mockGoTrueClient); testMClass = TestMClass(client: mockClient); }); group('TestAuthBloc', () { test('signinMc should return AuthResponse', () async { // 创建mock的响应结果 final mockAuthResponse = MockAuthResponse(); // 配置signInWithPassword方法的返回值 when(mockGoTrueClient.signInWithPassword( email: 'example@gmail', password: 'password', )).thenAnswer((_) async => mockAuthResponse); // 执行测试方法 final result = await testMClass.signinMc(); // 验证结果类型 expect(result, isA<AuthResponse>()); // 验证目标方法是否被正确调用 verify(mockGoTrueClient.signInWithPassword( email: 'example@gmail', password: 'password', )).called(1); }); }); }
关键说明
- 必须mock
GoTrueClient并与SupabaseClient关联,否则client.auth会返回null导致类型错误。 - 异步方法使用
thenAnswer配置返回值,同步属性使用thenReturn。 - 通过
verify可以验证目标方法的调用情况,确保测试逻辑的正确性。
内容的提问来源于stack exchange,提问作者Jaafar Melhem
相关产品推荐
相关产品推荐

