.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
相关产品推荐
相关产品推荐

