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

时间:2017-11-08 07:37:13

标签: c# unit-testing asp.net-core asp.net-core-mvc-2.0 asp.net-core-viewcomponent

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

如何对这样的组件进行单元测试?

我正在使用MSTest Freamwork。

以下属性用于我的代码

  1. 曲奇
  2. 会话
  3. 用户(System.Security.Principal)
  4. 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 个答案:

答案 0 :(得分:4)

根据源代码,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 :(得分:0)

这里只是异步示例,

 PYTHONPATH=<directory to mock>/mock:$PYTHONPATH <command to run unittests>