我正在使用 Xunit 编写 Controller 逻辑的单元测试。
我的 Controller 操作之一返回带有 ModelStateDictionary
对象的 BadRequestObjectResult
:
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
为此,我的测试用例添加了一个 ModelState 错误,如下所示:
controller.ModelState.AddModelError("Test", "This is a test model error");
在我的测试用例的 Assert 语句中,我正在检查类型为 SerializedError
的返回对象:
var returnError = Assert.IsType<SerializableError>(objectResult.Value);
Assert.Single(returnError);
Assert.True(returnError.ContainsKey("Test"));
Assert.True(returnError.ContainsValue("This is a test model error"));
Assert.Single(returnError);
和 Assert.True(returnError.ContainsKey("Test"));
检查按预期成功通过。
但是,对错误值的检查失败(它返回 false
但我希望它返回 true
):
Assert.True(returnError.ContainsValue("This is a test model error"));
从调试中我可以看到该值似乎嵌套在一个额外的string
对象中:
但我无法编写测试该值的测试。我该怎么做?
最佳答案
正如另一个答案中提到的,Dictionary 的值是一个数组,因此您应该在断言中解决该问题。
var returnError = Assert.IsType<SerializableError>(objectResult.Value);
var errors = objectResult.Value as SerializableError;
Assert.Single(errors);
Assert.True(errors.ContainsKey("Test"));
var errorValues = returnError["Test"] as string[];
Assert.Single(errorValues);
Assert.True(errorValues.Single() == "This is a test model error");
因为 SerializedError
继承自 Dictionary,因此您应该能够在 FluentAssertions 库的帮助下以更清晰的方式完成它
var expected = new SerializableError
{
{ "Test", new[] {"This is a test model error"}},
};
objectResult.Value.Should().BeOfType<SerializableError>();
objectResult.Value.Should().BeEquivalentTo(expected);
关于asp.net-core - Xunit 测试 SerializedError 返回对象值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58155343/