You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET 6单元测试中内存数据返回Generic.List为空问题排查

问题分析与解决思路

报错直接原因

你的SiteToSiteController.Index方法仅返回View(),未传入任何模型参数。MVC框架不会自动为无参数的View()填充ViewData.Model,因此单元测试中viewResult.ViewData.Model必然为null。而你的测试预期类型是System.Collections.Generic.List<PharmacyWarehouseV2.Models.SiteToSite>,类型不匹配直接触发Xunit.Sdk.IsAssignableFromException。

同类测试正常的核心差异

另一同类测试能正常运行,大概率是以下两种情况之一:

  • 对应的控制器方法主动向View()传入了模型(比如返回View(_service.GetAll())),框架会自动将传入的对象赋值给ViewData.Model;
  • 该测试的断言逻辑未针对ViewData.Model的类型做校验,而是验证了其他维度(比如服务方法的调用次数、视图名称正确性等)。

修正方案

方案1:调整控制器逻辑(推荐,符合MVC最佳实践)

修改Index方法,明确传入服务获取的模型:

public IActionResult Index()
{
    var siteToSiteList = _siteToSiteService.GetAll();
    return View(siteToSiteList);
}

此时单元测试中ViewData.Model会被正确赋值为List<SiteToSite>,断言可正常通过。

方案2:调整单元测试断言逻辑(若控制器逻辑无需修改)

放弃对ViewData.Model的类型断言,转而验证服务方法调用或视图正确性:

// 验证SiteToSiteService.GetAll()被调用一次
_mockSiteToSiteService.Verify(s => s.GetAll(), Times.Once);
// 验证返回的视图名称为Index
Assert.Equal("Index", viewResult.ViewName);

内容的提问来源于stack exchange,提问作者Rod

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 00:35:25