为什么Razor Page处理方法返回PartialViewResult的单元测试会失败?
问题根因
- Razor Page内置的
Partial()方法依赖运行时自动注入的上下文属性,包括PageContext、ViewData字典、模型元数据提供器等,单元测试场景下直接实例化的PageModel默认没有初始化这些属性,调用Partial()时就会触发空引用异常。 - JsonResult类型的返回不需要依赖上述页面上下文属性,因此同类方法可以正常通过测试;控制器的Partial方法测试正常是因为之前的测试用例已经提前给Controller实例初始化了
ActionContext等必要上下文。 - 现有测试代码存在语法误用:
It.IsAny<ApplicationModel>()是Moq框架专属的参数匹配语法,仅可用于Setup()、Verify()方法的入参匹配场景,直接用于属性赋值时只会返回对应类型的默认值(引用类型为null),属于潜在错误点。
修复方案
单元测试时手动给PageModel注入必要的上下文属性,同时修正属性赋值的语法即可,修复后的测试代码如下:
using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc.ModelBinding; using Microsoft.AspNetCore.Mvc.ViewFeatures; using Moq; using Xunit; [Fact] public void OnGetApplicationAddedModalPartial_WhenCalled_ShouldReturnPartialViewResultType() { // Arrange // 初始化PageModel依赖的上下文属性 var httpContext = new DefaultHttpContext(); var modelMetadataProvider = new EmptyModelMetadataProvider(); var viewData = new ViewDataDictionary(modelMetadataProvider, new ModelStateDictionary()); _sut.PageContext = new PageContext { HttpContext = httpContext, ViewData = viewData }; // 注入IUrlHelper依赖,部分.NET Core版本的Partial方法会依赖该属性 _sut.Url = new Mock<IUrlHelper>().Object; // 给Application属性赋值合法实例,禁止使用It.IsAny做赋值操作 _sut.Application = new ApplicationModel(); // Act var result = _sut.OnGetApplicationAddedModalPartial(); // Assert Assert.IsType<PartialViewResult>(result); // 可选追加校验:视图名、返回模型和入参一致 var partialResult = (PartialViewResult)result; Assert.Equal("_ApplicationAddedModalPartial", partialResult.ViewName); Assert.Same(_sut.Application, partialResult.Model); }
内容的提问来源于stack exchange,提问作者Lukas
相关产品推荐
相关产品推荐

