如何unit testingViewComponent.Invoke()?

ViewComponent对象中, HttpContextUser是只读属性。

如何对这样的组件进行unit testing?

我正在使用MSTest Freamwork。

以下属性用于我的代码中

  1. 曲奇饼
  2. 会议
  3. 用户(System.Security.Principal)

 public ViewViewComponentResult Invoke() { var vm = new SummaryViewModel(); if (User.Identity is ClaimsIdentity identity && identity.IsAuthenticated) { vm.IsAuthenticated = true; vm.UserName = identity.Claims.FirstOrDefault(c => c.Type == "UserName").Value; vm.PhotoUrl = identity.Claims.FirstOrDefault(c => c.Type == "FacePicture").Value; } return View(vm); } [TestMethod] public void UserSummaryVcTest() { var component = new UserSummaryViewComponent(); var model = component.Invoke().ViewData.Model as SummaryViewModel; Assert.AreEqual("UserName", model.UserName); } 

根据源代码, ViewComponent依赖于ViewComponentContext.ViewContext来公开那些只读属性,而这些属性又访问HttpContext 。 这是模拟所需值的入口点。

 [TestMethod] public void UserSummaryVcTest() { // Arrange var httpContext = new DefaultHttpContext(); //You can also Mock this //...then set user and other required properties on the httpContext as needed var viewContext = new ViewContext(); viewContext.HttpContext = httpContext; var viewComponentContext = new ViewComponentContext(); viewComponentContext.ViewContext = viewContext; var viewComponent = new UserSummaryViewComponent(); viewComponent.ViewComponentContext = viewComponentContext; //Act var model = viewComponent.Invoke().ViewData.Model as SummaryViewModel; //Assert Assert.AreEqual("UserName", model.UserName); }