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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 23:39:03