Назначение списка MethodCall в модульных тестах плагина Flutter
Настройка модульного теста по умолчанию при создании плагина выглядит следующим образом:
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, когда вы можете просто использовать один? Если бы это был всего лишь один случай, я бы не обращал на это большого внимания, но я вижу шаблон снова и снова в исходном коде.
1 ответ
Я считаю, что дело в том, чтобы убедиться, что обработчик вызова метода был запущен ровно один раз (и, следовательно, добавлен ("зарегистрирован") ровно одна запись в List<MethodCall>
). Если бы это было просто MethodCall
переменная, которая изменилась с null
не-null
проверить, что это не было вызвано несколько раз, было бы не так просто.