Flutter:测试是否抛出特定异常

时间:2019-01-17 17:37:49

标签: dart flutter flutter-test

简而言之,throwsA(anything)在使用dart进行单元测试时不足以满足我的需求。如何测试特定错误消息或类型

这是我想捕捉的错误:

class MyCustErr implements Exception {
  String term;

  String errMsg() => 'You have already added a container with the id 
  $term. Duplicates are not allowed';

  MyCustErr({this.term});
}

这是当前通过的断言,但是要检查上面的错误类型:

expect(() => operations.lookupOrderDetails(), throwsA(anything));

这就是我想要做的:

expect(() => operations.lookupOrderDetails(), throwsA(MyCustErr));

6 个答案:

答案 0 :(得分:12)

在Flutter 1.12.1中弃用了`TypeMatcher <>'之后,我发现这可行:

expect(() => operations.lookupOrderDetails(), throwsA(isInstanceOf<MyCustErr>()));

答案 1 :(得分:6)

截至 2021 年 4 月,这是正确的方法。

正确的方法

# when user client button
sock.send(request)
response = sock.recv().decode()
render(response)

一些例子显示:

不正确的方法

import 'package:dcli/dcli.dart';
import 'package:test/test.dart';

 /// GOOD: works in all circumstances.
 expect(() => restoreFile(file), throwsA(isA<RestoreFileException>()));

注意在 expect 之后缺少的 '() => '。

区别在于第一种方法适用于返回 void 的函数,而第二种方法则不能。

所以第一种方法应该是首选技术。

要测试特定的错误消息:

检查异常内容

import 'package:dcli/dcli.dart';
import 'package:test/test.dart';
 /// BAD: works but not in all circumstances
 expect(restoreFile(file), throwsA(isA<RestoreFileException>()));

答案 2 :(得分:1)

这应该做您想要的:

expect(() => operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));

expect(() => operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));

答案 3 :(得分:0)

如果有人想像我一样要做一个​​异步功能测试,您需要做的就是在期望中添加async关键字,请记住lookupOrderDetails是一个异步功能:

expect(() **async** => **await** operations.lookupOrderDetails(), throwsA(const TypeMatcher<MyCustErr>()));

expect(() **async** => **await** operations.lookupOrderDetails(), isInstanceOf<MyCustErr>()));

它仍然使用Gunter的答案,很好!

答案 4 :(得分:0)

首先导入正确的软件包'package:matcher / matcher.dart';

expect(() => yourOperation.yourMethod(),
      throwsA(const TypeMatcher<YourException>()));

答案 5 :(得分:0)

当前期望函数调用抛出异常的正确方法是:

expect(operations.lookupOrderDetails, throwsA(isA<MyCustErr>()));`