You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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);
    });
  });
}

关键说明

  • 必须mockGoTrueClient并与SupabaseClient关联,否则client.auth会返回null导致类型错误。
  • 异步方法使用thenAnswer配置返回值,同步属性使用thenReturn。
  • 通过verify可以验证目标方法的调用情况,确保测试逻辑的正确性。

内容的提问来源于stack exchange,提问作者Jaafar Melhem

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 14:18:13