更新:底部的解决方案
.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);