c# - .Net Core 中的单元测试 JsonResult 匿名类型
问题描述
更新:底部的解决方案
在 .net 核心 JsonResult 中没有“数据”属性。许多现有的回答我们该属性以检索单元测试所需的值。
我似乎无法解决这里的问题:
public async Task<IActionResult> GetIndividualPerformanceMetrics(string npi)
{
var metrics = new List<PhysicianMetric>();
var overallRank = new OverallPhysicianRank();
var userNPI = User.GetSingleClaimValueByType(Constants.ClaimTypes.Npi);
npi = string.IsNullOrWhiteSpace(npi) ? userNPI : npi;
if (npi != null)
{
if (await _authorizationService.AuthorizeAsync(User, "IsMetricSupportTeam")
|| User.GetAllClaimsByType(Constants.ClaimTypes.Npi).Any(n => n.Value == npi))
{
metrics = (await _physicianMetrics.GetAllByNPIAsync(npi)).ToList();
}
}
return Json(new { metrics });
}
在我的单元测试中,我正在执行以下操作:
_physicianMetrics.Setup(pm => pm.GetAllByNPIAsync(validNPI))
.ReturnsAsync(new List<PhysicianMetric>(){_physicianMetric});
var anonymousDefinition = new { metrics = new List<PhysicianMetric>() };
//Act
var result = await (performanceMetricsController.GetIndividualPerformanceMetrics(validNPI)) as JsonResult;
var obj = JsonConvert.DeserializeAnonymousType(result.Value.ToString(), anonymousDefinition);
//Assert
Assert.AreEqual(validNPI, obj.metrics[0].NPI);
JsonResult 与模拟的存储库值一起返回,但我似乎无法编写测试,以便我可以确保 JsonResult 数据是存储库查询返回的数据。反序列化失败并出现以下错误:
“解析属性名称后出现无效字符。应为':'但得到:=。路径'',第1行,位置10。”
我只需要验证 JsonResult 值。
请帮忙。
解决方案:(感谢克里斯普拉特)
我没有意识到 JsonResult 还没有序列化对象,而 JsonResult.Value 是纯匿名类型。我只是使用反射来调出我需要的对象列表并且很好:
var result = await (performanceMetricsController.GetIndividualPerformanceMetrics(validNPI)) as JsonResult;
var metrics = result.Value.GetType().GetProperty("metrics")?.GetValue(result.Value, null) as List<PhysicianMetric>;
//Assert
_physicianMetrics.Verify(pm => pm.GetAllByNPIAsync(validNPI), Times.Once);
Assert.AreEqual(validNPI, metrics[0]?.NPI);
解决方案
推荐阅读
- linux - 针对 Ubuntu 的 Linux Alpine 中的交叉编译
- firebase - 酒店预订系统的 Firestore 数据结构
- python - Python - 在单独的行上的两个列表中输出元素
- php - 雄辩模型中的 Laravel 关系
- saml - 在 IdP 启动的 SSO 中解析 SAML 响应时出现 Keycloak 错误
- verilog - 我如何编写这个 verilog 测试平台?
- powershell - powershell 和 cmd 的问题与管道
- sql - 将 JOIN 与 OR 结合
- mongodb - 是否可以在 Meteor 1.7+ 中订阅文本搜索光标
- arrays - 在 postgres 9.6 函数中连接 Json 对象中的值