简体   繁体   中英

How to write test for flutter package Flutter WeChat Assets Picker

I am trying to write a test on this flutter package https://pub.dev/packages/wechat_assets_picker using the Mocktail package https://pub.dev/packages/mocktail , but this package does not seem to have test in the documentation.

I have included the minimum reproducible example. The test file is currently not working, it is included as an example test code using the flutter Mocktail package.

It is supposed to mock AssetPicker.pickAssets to test whether it is actually called with the correct arguments. I am running in IOS simulator, we will need to add this key in ios/Runer/Info.plist , otherwise the simulator will close unexpectedly after clicking the add button.

main.dart

import 'package:flutter/material.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key, required this.title}) : super(key: key);

  final String title;

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: const [],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: () async {
          final List<AssetEntity>? result =
              await AssetPicker.pickAssets(context);
        },
        tooltip: 'Add photo',
        child: const Icon(Icons.add),
      ),
    );
  }
}

widget_test.dart

import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mocktail/mocktail.dart';
import 'package:wechat/main.dart';
import 'package:wechat_assets_picker/wechat_assets_picker.dart';

class _MockAssetPicker extends Mock implements AssetPicker {}

void main() {
  testWidgets('It should call the WeChat asset picker',
      (WidgetTester tester) async {
    await tester.pumpWidget(const MyApp());
    final BuildContext context = tester.element(find.byType(MyApp));

    final assetPickerMock = _MockAssetPicker();
    when(() => assetPickerMock.pickAssets(context)).thenAnswer((_) => Future.value([
          const AssetEntity(
            id: 'id1',
            typeInt: 1,
            width: 100,
            height: 100,
          ),
        ]));
    AssetPicker.instance = assetPickerMock;

    await tester.tap(find.byIcon(Icons.add));
    await tester.pump();

    verify(() => assetPickerMock.pickAssets(context)).called(1);
  });
}

Mocking the picker is supported by the separated picker delegate: https://github.com/fluttercandies/flutter_wechat_assets_picker/pull/315

TL;DR, build your own delegate first, then set it through AssetPicker.setPickerDelegate(TestAssetPickerDelegate());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM