测试 Flutter 中是不是抛出了特定的异常

Posted

技术标签:

【中文标题】测试 Flutter 中是不是抛出了特定的异常【英文标题】:Test that a specific exception is thrown in Flutter测试 Flutter 中是否抛出了特定的异常 【发布时间】:2021-08-25 13:04:56 【问题描述】:

我有一个检查异常的测试:

test('throws an exception if missing data', () async 
  final client = MockClient();
  final _apiService = ApiService(client, 'test/');

  when(
    client.post(
      Uri.parse('test/user/auth_user'),
      headers: 
        'Content-Type': 'application/json',
      ,
      body: json.encode("email": '', "password": ''),
    ),
  ).thenAnswer(
    (_) async => http.Response(
      '"status": 400,"data": "message": "Missing email or password fields"',
      400,
    ),
  );

  expect(
    await _apiService.login(email: '', password: ''),
    isA<MissingDataException>(),
  );
);

但不工作,这是测试的输出:

这是我的例外:

class MissingDataException implements Exception 
  String message;
  MissingDataException(this.message);

我试过了

throwsException

并没有工作。

我也试过

throwsA(TypeMatcher<MissingDataException>())

也没有工作。

我能做什么?

提前致谢。

【问题讨论】:

【参考方案1】:

我终于发现,只需将 await 拉出函数即可:

expect(
  _apiService.login(email: '', password: ''),
  throwsA(isA<MissingDataException>()),
);

【讨论】:

【参考方案2】:

重构这个:

expect(
  await _apiService.login(email: '', password: ''),
  isA<MissingDataException>(),
);

到这里:

final fn = () async => await _apiService.login(email: '', password: '');

expect(
  fn,
  throwsA(isA<MissingDataException>())
);

您需要将函数引用传递给expect 以验证异常。现在,您将isA&lt;MissingDataException&gt;login() 的结果进行比较,但异常不会作为结果返回,应该进行处理。

【讨论】:

以上是关于测试 Flutter 中是不是抛出了特定的异常的主要内容,如果未能解决你的问题,请参考以下文章

又抛出了一个异常:A RenderFlex 右边溢出了 3.0 像素

Flutter:在小部件测试中测试异常

PHPUnit 断言抛出异常?

java捕获到异常后,异常后的语句不会被执行

Discord.NET - 获取命令中抛出了哪种类型的异常

从路由返回了无效的 JSON。也许抛出了异常?