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

如何在Flutter端对Supabase Storage进行E2E测试Mock?

在Patrol E2E测试中Mock Supabase Storage的download方法

当然可以只Mock storage.from('...').download 方法,核心思路是通过Mock Supabase客户端调用链中的各个对象,最终拦截download方法并返回预期结果。以下是具体实现步骤:

1. 添加测试依赖

在pubspec.yaml的dev_dependencies中添加Mock工具(推荐使用mocktail,语法更简洁)和Patrol测试依赖:

dev_dependencies:
  flutter_test:
    sdk: flutter
  patrol: ^2.0.0
  mocktail: ^1.0.0

2. 创建Mock类

针对Supabase的客户端、存储服务和存储桶创建Mock类,用于拦截方法调用:

import 'package:mocktail/mocktail.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

class MockSupabaseClient extends Mock implements SupabaseClient {}
class MockStorageClient extends Mock implements StorageClient {}
class MockBucket extends Mock implements Bucket {}

3. 编写Patrol测试用例

在测试中构建Mock调用链,替换真实的Supabase实例,并指定download方法的返回值:

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:patrol/patrol.dart';
import 'package:supabase_flutter/supabase_flutter.dart';

// 导入上面创建的Mock类

void main() {
  patrolTest('验证文档下载功能', ($) async {
    // 初始化Mock对象
    final mockSupabase = MockSupabaseClient();
    final mockStorage = MockStorageClient();
    final mockGeneralBucket = MockBucket();

    // 构建调用链:client.storage → storage.from('general') → bucket.download(...)
    when(() => mockSupabase.storage).thenReturn(mockStorage);
    when(() => mockStorage.from('general')).thenReturn(mockGeneralBucket);

    // Mock download方法,返回预期的文件内容(这里用字符串转Uint8List模拟)
    final mockPdfContent = Uint8List.fromList('模拟PDF文件内容'.codeUnits);
    when(() => mockGeneralBucket.download('/trainings/2023-04-17.pdf'))
        .thenAnswer((_) async => mockPdfContent);

    // 替换Supabase的全局客户端实例
    await Supabase.instance.dispose(); // 先销毁原有实例
    Supabase.instance.client = mockSupabase;

    // 启动应用
    await $.pumpWidgetAndSettle(const MyApp());

    // 执行测试操作:比如触发下载按钮
    await $.tap(find.byKey(const Key('download_training_btn')));

    // 验证download方法是否被正确调用
    verify(() => mockGeneralBucket.download('/trainings/2023-04-17.pdf')).called(1);

    // 可添加额外断言:比如验证UI是否展示了下载成功的提示或内容
    expect(find.text('下载完成'), findsOneWidget);
  });
}

关键说明

  • 只需要Mock调用链中用到的环节:如果你的代码只用到storage.from('general').download,那么只需要为这几个方法设置返回逻辑,其他未用到的方法无需额外Mock。
  • 全局实例替换:通过Supabase.instance.client = mockSupabase替换真实客户端,确保应用代码调用的是Mock对象。
  • 验证调用:使用verify可以确认download方法是否按预期被调用,保证测试的准确性。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 02:22:26