我的应用程序中包含以下代码:
expect(() => dataSource.getLastPost(), throwsA(TypeMatcher<CacheException>()));
这导致以下错误
Expected: throws <Instance of 'TypeMatcher<CacheException>'>
Actual: <Closure: () => Future<PostModel>>
Which: threw <Instance of 'CacheException'>
如果我删除包装CacheException的TypeMatcher ...
expect(() => dataSource.getLastPost(), throwsA(CacheException()));
那么它仍然会给出类似的错误
Expected: throws <Instance of 'CacheException'>
Actual: <Closure: () => Future<PostModel>>
Which: threw <Instance of 'CacheException'>
我想知道我在做什么错?无论哪种方式,很明显,我们都期望CacheException和CacheException被抛出。那为什么期望测试没有通过?
最佳答案
写throwsA(TypeMatcher<CacheException>())
是正确的
您可能会遇到的问题是,在Flutter和测试的上下文中,有两个名称为TypeMatcher
的类:
软件包matcher
中的
flutter/widgets
中的BuildContext
内部导航。 它们的使用方式相同,即
TypeMatcher<SomeClass>
。但是其中只有一个是Matcher
,测试可以理解。您的问题是,您可能使用了
TypeMatcher
中的flutter/widgets
。由于它不是匹配器,因此:throwsA(TypeMatcher<MyClass>())
被解释为:
throwsA(equals(TypeMatcher<MyClass>())
解决方案是使用
TypeMatcher
中的正确package:matcher/matcher.dart
。但是首先,您应该而不是直接使用
TypeMatcher
。代替:
throwsA(TypeMatcher<MyClass>())
您应该使用速记
isA<T>
匹配器:throwsA(isA<MyClass>())
这样可以完全消除名称冲突