Asp.net core Xunit测试序列化错误返回对象值

Asp.net core Xunit测试序列化错误返回对象值,asp.net-core,xunit,Asp.net Core,Xunit,我正在用Xunit编写控制器逻辑的单元测试 我的一个控制器操作返回带有ModelStateDictionary对象的BadRequestObjectResult: if (!ModelState.IsValid) { return BadRequest(ModelState); } 为此,我的测试用例添加了一个ModelState错误,如下所示: controller.ModelState.AddModelError("Test", "This is a test model erro

我正在用Xunit编写控制器逻辑的单元测试

我的一个控制器操作返回带有
ModelStateDictionary
对象的
BadRequestObjectResult

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}
为此,我的测试用例添加了一个ModelState错误,如下所示:

controller.ModelState.AddModelError("Test", "This is a test model error");
在测试用例的Assert语句中,我正在检查返回对象,其类型为
SerializableError

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"));
通过调试,我可以看到该值似乎嵌套在一个额外的
字符串
对象中:

if (!ModelState.IsValid)
{
    return BadRequest(ModelState);
}


但我一直无法编写测试值的测试。我该怎么做?

您的值是一个列表。所以值[0]或Value.First()。它是一个keyvaluepair,因此您应该能够通过returnError[keyName]访问它。

如另一个答案中所述,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");

您需要将响应转换为ObjectResult,请参见下文

var result=response.result作为BadRequestObjectResult

var result=response.result作为OkObjectResult


现在,您可以使用result.value属性访问该值

我还没有找到通过IndexTransks访问该值的方法。我可以像字符串[]那样访问它;True(值[0]=“这是一个测试模型错误”)但一定有更好的方法吗?您可以在
Assert.Single(actualError)上使用项[key]->()我收到一个“无法从'object'转换为'System.Collections.IEnumerable”错误,很抱歉,我今天遇到了麻烦。在
Assert.True(actualError.Single()=“这是一个测试模型错误”)我得到一个“'object'不包含'Single'的定义,并且没有可访问的扩展方法'Single'接受'object'类型的第一个参数”。我使用了FluentAssertions库,这种方法是有效的。谢谢你的提示。:)
var expected = new SerializableError
{
    { "Test", new[] {"This is a test model error"}},
};

objectResult.Value.Should().BeOfType<SerializableError>();
objectResult.Value.Should().BeEquivalentTo(expected);