Xunit 测试 SerializableError return 对象值

Xunit test SerializableError return object value

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

我的控制器操作之一 returns BadRequestObjectResultModelStateDictionary 对象:

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

为此,我的测试用例添加了一个 ModelState 错误,如下所示:

controller.ModelState.AddModelError("Test", "This is a test model error");

在我的测试用例的 Assert 语句中,我正在检查类型为 SerializableError:

的 return 对象
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")); 检查按预期成功通过。

但是,检查错误值的检查失败(returns false 但我希望它 return true):

Assert.True(returnError.ContainsValue("This is a test model error"));

我从调试中可以看出,Value 似乎嵌套在一个额外的 string 对象中:

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

您的值是一个列表。所以值 [0] 或 Value.First()。它是一个键值对,因此您应该能够通过 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");

因为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);

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

var result = response.Result as BadRequestObjectResult

var result = response.Result as OkObjectResult

现在您可以使用 result.Value 属性

访问该值