使用 Future.then 进行 Flutter 单元测试

Flutter Unit Test with Future.then

我想编写一个 flutter 单元测试,其中未来将结果映射到不同的东西,return再次将新结果作为未来,例如:

Future<String> invoke() => class.doSomething().then((value) => map(value));

示例方法“invoke()”应该 return 映射值。


正测试,returning 映射值,正在工作。 (下面示例中的 test1)

负测试 returning Future.error 失败并出现此错误(下面示例中的测试 2):

Invalid argument(s) (onError): The error handler of Future.catchError must return a value of the future's type

有谁知道如何改进测试,以便我可以像测试 2 中描述的那样测试错误情况:

import 'package:mockito/annotations.dart';
import 'package:mockito/mockito.dart';
import 'package:test/test.dart';

import 'test_test.mocks.dart';

class A {
  final B b;

  A(this.b);

  Future<String> doSomething() => b.doSomething().then((value) => "mappedResult");
}

class B {
  Future<int> doSomething() => Future.delayed(const Duration(seconds: 1));
}

@GenerateMocks([B])
void main() {
  final bmock = MockB();

  test('test1', () async {
    when(bmock.doSomething()).thenAnswer((_) => Future.value(1));

    var result = await A(bmock).doSomething();

    expect(result, "mappedResult");
  });

  test('test2', () async {
    when(bmock.doSomething()).thenAnswer((_) => Future.error("error"));

    A(bmock).doSomething().catchError((error) {
      expect(error, "error");
    });
  });
}

版本:

  Flutter 2.10.1
  mockito: ^5.0.17
  test: ^1.17.12
  1. .

  2. 但是,Future.catchError使用起来很混乱,最好完全避免使用它:

try {
  await A(bmock).doSomething();
  fail('doSomething did not throw');
} catch (e) {
  expect(e, 'error');
}

或者您可以使用 expectLater:

await expectLater(A(bmock).doSomething(), throwsA('error'));