首页 > 解决方案 > .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);

标签: c#unit-testingasp.net-corejsonresult

解决方案


推荐阅读