我的应用程序中包含以下代码:

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中的

  • TypeMatcher,用于测试
  • flutter/widgets中的
  • TypeMatcher,可在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>())
    

    这样可以完全消除名称冲突

    08-18 01:38