gpt4 book ai didi

c# - 断言包含匿名类型的 JsonResult

转载 作者:IT老高 更新时间:2023-10-28 12:48:45 29 4
gpt4 key购买 nike

我试图在我的一个 Controller 中对返回 JsonResult 的方法进行单元测试。令我惊讶的是,以下代码不起作用:

[HttpPost]
public JsonResult Test() {
return Json(new {Id = 123});
}

这是我测试它的方式(另请注意,测试代码驻留在另一个程序集中):

// Act
dynamic jsonResult = testController.Test().Data;

// Assert
Assert.AreEqual(123, jsonResult.Id);

Assert 抛出异常:

'object' does not contain a definition for 'Id'

我已经使用以下方法解决了它:

[HttpPost]
public JsonResult Test() {
dynamic data = new ExpandoObject();
data.Id = 123;
return Json(data);
}

我试图理解为什么第一个不起作用?它似乎也适用于除了匿名类型之外的任何东西。

最佳答案

需要明确的是,您遇到的具体问题是 C# 动态不适用于非公共(public)成员。这是设计使然,大概是为了阻止这种事情。由于正如 LukLed 所说,匿名类型仅在同一个程序集中是公共(public)的(或者更准确地说,匿名类型只是标记为 internal,而不是 public),你会遇到这个障碍。

可能最干净的解决方案是使用 InternalsVisibleTo。它允许您命名另一个可以访问其非公共(public)成员的程序集。将其用于测试是其存在的主要原因之一。在您的示例中,您将在主项目的 AssemblyInfo.cs 中放置以下行:

[assembly: InternalsVisibleTo("AssemblyNameOfYourTestProject")]

一旦你这样做了,错误就会消失(我自己试过了)。

或者,您可以只使用蛮力反射:

Assert.AreEqual(123, jsonResult.GetType().GetProperty("Id").GetValue(jsonResult, null));

关于c# - 断言包含匿名类型的 JsonResult,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16876144/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com