gpt4 book ai didi

unit-testing - `TypeMatcher` 与 `throwsA` 一起使用时不起作用

转载 作者:行者123 更新时间:2023-12-03 02:41:40 25 4
gpt4 key购买 nike

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

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。那为什么expect测试没有通过呢?

最佳答案

throwsA(TypeMatcher<CacheException>()) 写是对的

问题是您可能面临的问题是,在 Flutter 和测试的上下文中,有两个名为 TypeMatcher 的类:

  • TypeMatcher 来自 matcher 包,用于测试
  • TypeMatcher 来自 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>())

    这完全消除了名称冲突

    关于unit-testing - `TypeMatcher` 与 `throwsA` 一起使用时不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59214629/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com