【问题标题】:FluentAssertions: How to break through drill-down of Which/And cascades?FluentAssertions:如何突破Which/And cascades的向下钻取?
【发布时间】:2020-01-18 03:35:17
【问题描述】:

FluentAssertions 中是否有办法避免 .And.Which 级联的自动对象图钻取? 还有一些钻取点我想回到根级别并检查状态代码。

小代码示例:

    Func<Task> action = async () => await this.someContext.someResponseTask;

    action.Should()
        .Throw<SwaggerOpenApiException<IList<ApiValidationError>>>()
        .Which.Result.Should().Contain(x => x.ErrorCode == errorCode)
        .Which.ErrorDetails.Should().Contain(dictionaryWithParsedErrorDetails)

        // NOTE: This does not work (compile) as it operates on "ErrorDetails",
        //       would like to access root level exception again.
        .Which.StatusCode.Should().Be(HttpStatusCode.Conflict);

显然,我可以将 await this.someContext.someResponseTask 包装到 try/catch 中并将异常存储到变量中,但这并不是一种真正优雅的方式,尤其是在 FluentAssertions 触手可及的情况下。

【问题讨论】:

  • Should().Throw 已经将调用的委托包装在 try-catch 中并返回异常。您实际上应该使用ThrowAsync
  • 谢谢,这完全有道理。实际问题仍然存在。 :)
  • 我正在尝试构建一个解决方案,但我无法弄清楚SwaggerOpenApiException的定义
  • 这是自定义和生成的代码。问题是SwaggerOpenApiException 有一个名为Result 的属性,而Result 有一个名为ErrorDetails 的属性,所以.Which 你只能更深入地进入兔子洞,但根据这种机制,不可能得到再次到上层属性(这里我想再次进入异常级别)。什么会起作用action.Should().Throw&lt;SwaggerOpenApiException&lt;IList&lt;ApiValidationError&gt;&gt;&gt;().Which.Should().Match&lt;SwaggerOpenApiException&lt;IList&lt;ApiValidationError&gt;&gt;&gt;(e =&gt; e.Result.Any(r =&gt; r.ErrorCode == errorCode) &amp;&amp; ...); - 没有你的优化

标签: c# fluent-assertions


【解决方案1】:

这些是我发现的 3 个解决方案,它们可以在处理 Exception 时遍历对象图的单独路径。

顺序表示在测试失败的情况下摘要的信息丰富度。因此,例如#3 将所有内容都放入一个表达式中并不能准确地告诉您失败的原因。

第一项非常准确。

1.

var exceptionAssertion = action.Should().Throw<SwaggerOpenApiException<IList<ApiValidationError>>>();

exceptionAssertion.Which.Result.Should().Contain(x => x.ErrorCode == errorCode);
exceptionAssertion.Which.StatusCode.Should().Be((int)HttpStatusCode.Conflict);

2.

// NOTE: This .Where is not LINQ, it's from FluentAssertions!
action.Should().Throw<SwaggerOpenApiException<IList<ApiValidationError>>>()
    .Where(e => e.Result.Any(r => r.ErrorCode == errorCode))
    .Where(e => e.StatusCode == (int)HttpStatusCode.Conflict);

3.

action.Should()
    .Throw<SwaggerOpenApiException<IList<ApiValidationError>>>()
    .Which.Should().Match<SwaggerOpenApiException<IList<ApiValidationError>>>(
        e =>
            e.Result.Any(r => r.ErrorCode == errorCode) &&
            e.StatusCode == (int)HttpStatusCode.Conflict);

【讨论】:

    猜你喜欢
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多