【发布时间】: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<SwaggerOpenApiException<IList<ApiValidationError>>>().Which.Should().Match<SwaggerOpenApiException<IList<ApiValidationError>>>(e => e.Result.Any(r => r.ErrorCode == errorCode) && ...);- 没有你的优化
标签: c# fluent-assertions