在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的情况下。

最佳答案

这是我发现的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);

09-11 15:08