如何对ViewComponent.Invoke()进行单元测试?

13
ViewComponent对象中,HttpContextUser是只读属性。
如何对这样的组件进行单元测试?
我正在使用MSTest框架。
我的代码中使用以下属性:
  1. Cookie
  2. Session
  3. User(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);
} 
2个回答

11
根据源代码,ViewComponent 依赖于 ViewComponentContext.ViewContext 来公开这些只读属性,转而访问 HttpContext。 这是模拟所需值的入口点。
[TestMethod]
public void UserSummaryVcTest() {

    // Arrange
    var expected = "Username value";
    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(expected, model.UserName);
} 

1
我认为可以对调用结果的数据类型进行断言,类似于:Assert.IsType<SummaryViewModel>(result.ViewData.Model); - wtf512

1
这里只是一个异步操作的示例,保留了HTML标记。
    [TestMethod]
        public async System.Threading.Tasks.Task InvokeAsyncNameAsync()
{
# setup mocks
...
var httpContext = new DefaultHttpContext();
            var viewContext = new ViewContext();
            viewContext.HttpContext = httpContext;
            var viewComponentContext = new ViewComponentContext();
            viewComponentContext.ViewContext = viewContext;

            var footerComponent = CreateComponentInstance();
            footerComponent.ViewComponentContext = viewComponentContext;

            ViewViewComponentResult result = await footerComponent.InvokeAsync() as ViewViewComponentResult;
            FooterModel resultModel = (FooterModel)result.ViewData.Model;

....
# do your asserts verifications

            Assert.AreEqual(expectedTest, resultModel.FooterText);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接