0

创建插件时的默认单元测试设置如下所示:

void main() {
  const MethodChannel channel = MethodChannel(
      'com.example/my_plugin');

  setUp(() {
    channel.setMockMethodCallHandler((MethodCall methodCall) async {
      return '42';
    });
  });

  tearDown(() {
    channel.setMockMethodCallHandler(null);
  });

  test('getPlatformVersion', () async {
    expect(await MyPlugin.platformVersion, '42');
  });
}

但是,在很多源代码中,我看到人们使用List<MethodCall>被调用的log. 这是一个例子

  test('setPreferredOrientations control test', () async {
    final List<MethodCall> log = <MethodCall>[];

    SystemChannels.platform.setMockMethodCallHandler((MethodCall methodCall) async {
      log.add(methodCall);
    });

    await SystemChrome.setPreferredOrientations(<DeviceOrientation>[
      DeviceOrientation.portraitUp,
    ]);

    expect(log, hasLength(1));
    expect(log.single, isMethodCall(
      'SystemChrome.setPreferredOrientations',
      arguments: <String>['DeviceOrientation.portraitUp'],
    ));
  });

我理解使用 的嘲弄setMockMethodCallHandler,但是当你可以只使用一个 MethodCall 时,为什么还要使用一个列表呢?如果只是一种情况,我可能不会太在意,但我在源代码中一遍又一遍地看到这种模式。

4

1 回答 1

3

我相信重点是验证方法调用处理程序是否被触发了一次(因此添加(“记录”)恰好一个条目进入List<MethodCall>)。如果它只是一个MethodCallnull变为 non-的变量,null那么验证它没有被多次触发就不会那么简单了。

于 2019-06-25T05:34:22.123 回答