我正在使用Xunit编写控制器逻辑的单元测试。
我的一个控制器动作返回带有BadRequestObjectResult
对象的ModelStateDictionary
:
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"));
Assert.Single(returnError);
和Assert.True(returnError.ContainsKey("Test"));
检查成功按预期通过。
但是,对错误值的检查失败(返回false
,但我希望它返回true
):
Assert.True(returnError.ContainsValue("This is a test model error"));
我从调试中可以看到,Value似乎嵌套在一个额外的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");
由于SerializableError
继承自Dictionary,因此您应该能够在FluentAssertions库的帮助下以更清晰的方式进行操作
var expected = new SerializableError
{
{ "Test", new[] {"This is a test model error"}},
};
objectResult.Value.Should().BeOfType<SerializableError>();
objectResult.Value.Should().BeEquivalentTo(expected);
您的值是一个列表。所以Value [0]或Value.First()。它是一个键值对,因此您应该可以通过returnError [keyName]进行访问。