【问题标题】:Fluent assertion Should().ThrowExactlyAsync should fail for derived types, but it doesn't流利的断言 Should().ThrowExactlyAsync 对于派生类型应该失败,但它不会
【发布时间】:2021-12-28 13:17:56
【问题描述】:

以下Func 代表抛出ArgumentNullException

Func<Task> act = async () => await _someService
            .someMethod(1, 2, 3, 4);

使用Fluent assertions,断言:

act.Should().ThrowExactlyAsync<ArgumentException>();

应该失败:

断言当前的Func 抛出了与TException 完全相同类型的异常(而不是派生的异常类型)。

ArgumentNullException 派生自 ArgumentException,根据描述,断言应该失败,但它通过了。

这是一个错误还是我滥用了这个?

【问题讨论】:

  • ThrowExactlyAsync 中指定ArgumentNullException 时是否会失败?

标签: c# unit-testing fluent-assertions


【解决方案1】:

由于ThrowExactlyAsync 返回一个Task,除非你await 它,否则你实际上并没有做任何事情:

await act.Should().ThrowExactlyAsync<ArgumentException>();

【讨论】:

  • 在进一步检查中我发现actSystem.Func'1[[System.Threading.Tasks.Task, System.Private.CoreLib, Version=4.0.0.0, Culture=neutral...]] 这与ArgumentException 有什么相同之处?我的意思是,它怎么能通过测试?顺便说一句,谢谢您的回答。
  • 它通过了,因为实际上没有执行任何测试/断言。这是一个任务,基本上是运行断言的承诺。顺便说一句,感谢您的接受,这让我终于超过了 100k 代表哈哈
  • 我明白了,有道理。好吧,这是正确的答案,所以,除了你自己之外,没有人要为此负责:D 我很高兴我是那个推动你通过的人。 ???
【解决方案2】:

替换act.Should().ThrowExactlyAsync&lt;ArgumentException&gt;();
await act.Should().ThrowExactlyAsync&lt;ArgumentException&gt;();\

这会给你一个正确的结果(在这种情况下失败)。

【讨论】:

  • 那么,我 5 分钟前写的究竟是什么?
  • 是的,我是在你写完之后发布的 - 错过了“一个新答案”链接。
猜你喜欢
  • 2021-01-18
  • 2018-12-01
  • 2019-06-03
  • 2023-01-30
  • 2023-03-27
  • 1970-01-01
  • 2022-07-23
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多