如何编写单元测试验证ASP.NET Core页面标题?测试抛异常求解决
解决ASP.NET Core Razor页面单元测试空引用异常
问题原因
单元测试运行时抛出NullReferenceException,根源是IndexModel继承的PageModel中ViewData属性默认未初始化,而OnGet方法直接访问ViewData["Title"],导致空引用。
修复方案
方案1:在测试中初始化ViewData
修改单元测试代码,手动为PageModel的ViewData属性赋值:
using Microsoft.VisualStudio.TestTools.UnitTesting; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.Extensions.Logging; using Presentation_app.Pages; using Microsoft.AspNetCore.Mvc.ViewFeatures; namespace UnitTestProject { [TestClass] public class UnitTest1 { [TestMethod] public void VerifyHomePageTitle() { // Arrange var logger = new LoggerFactory().CreateLogger<IndexModel>(); var pageModel = new IndexModel(logger); // 初始化ViewData字典 pageModel.ViewData = new ViewDataDictionary( new EmptyModelMetadataProvider(), new ModelStateDictionary() ); // Act pageModel.OnGet(); string title = pageModel.Title; // Assert Assert.IsNotNull(title); Assert.AreEqual("Home page", title); } } }
方案2:优化PageModel逻辑(推荐)
原代码中IndexModel的OnGet方法通过ViewData中转赋值Title属于冗余操作,且依赖未初始化的ViewData。可以简化代码,直接为Title赋值:
修改Index.cshtml.cs:
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; namespace Presentation_app.Pages { public class IndexModel : PageModel { private readonly ILogger<IndexModel> _logger; public string Title { get; private set; } public IndexModel(ILogger<IndexModel> logger) { _logger = logger; } public void OnGet() { Title = "Home page"; // 若需保持ViewData赋值,确保在测试中初始化ViewData,或移除该行(cshtml中已设置) // ViewData["Title"] = Title; } } }
此时原单元测试代码无需修改即可正常运行,因为OnGet不再依赖未初始化的ViewData。
补充说明
- 若保留
ViewData["Title"]的赋值,仍需在测试中初始化ViewData; - 测试方法名建议改为有意义的名称(如
VerifyHomePageTitle),便于识别测试意图。
内容的提问来源于stack exchange,提问作者Elena Isabella
相关产品推荐
相关产品推荐

