.Net Core中的单元测试JsonResult匿名类型

时间:2018-06-19 16:13:06

标签: c# unit-testing asp.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);

0 个答案:

没有答案