代码之家  ›  专栏  ›  技术社区  ›  user3034243

如何单元测试GlassController操作,该操作返回获取模型的视图

  •  3
  • user3034243  · 技术社区  · 7 年前

    我是一名sitecore开发者,我想创建一个示例sitecore helix单元测试项目,用于测试我们的“HomeBottomContentController”控制器:

        public class HomeBottomContentController : GlassController
        {
            private readonly ISitecoreContext _iSitecoreContext;
            public HomeBottomContentController(ISitecoreContext iSitecoreContext)
            {
                _iSitecoreContext = iSitecoreContext;
            }
    
            public override ActionResult Index()
            {
                var model = _iSitecoreContext.GetCurrentItem<Home_Control>();
                return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model);
            }
        }
    

    namespace WTW.Feature.HomeBottomContent.Tests
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void Test_ISitecoreContextInsertion()
            {
                var iSitecoreContext = Mock.Of<Glass.Mapper.Sc.ISitecoreContext>();
                HomeBottomContentController controllerUnderTest = new HomeBottomContentController(iSitecoreContext);
                var result = controllerUnderTest.Index() as ViewResult;
                Assert.IsNotNull(result);
            }
        }
    }
    

    该测试确实通过,意味着“结果”不为空;然而,问题是,当我进入Index()代码时,我看到“model”变量为空

        var model = _iSitecoreContext.GetCurrentItem<Home_Control>();
    

    我的问题是,我如何准确地更改此代码以确保该行中的“模型”不会变为null?如何在单元测试代码中为iSitecoreContext“模拟”一个项,使其具有一个“Home\u控件”模板,其字段具有合法值?这是正确的方法吗?我发现的大多数在线资源都没有类似的场景,我正在寻找尽可能最短的代码。

    我的另一个问题是,如果声明了SitecoreContext,我如何在我的[TestMethod]中测试下面的Index()方法 在…内

    public override ActionResult Index()
    {
        var context = new SitecoreContext();
        var model = context.GetCurrentItem<Home_Control>();
        return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model);
    }
    
    2 回复  |  直到 7 年前
        1
  •  1
  •   Nkosi    7 年前

    在这种情况下,您需要在模拟的依赖项上模拟所需的行为

    [TestClass]
    public class UnitTest1 {
        [TestMethod]
        public void Test_ISitecoreContextInsertion() {
            //Arrange
            var model = new Home_Control() {
                //...populate as needed
            }
            var iSitecoreContext = new Mock<Glass.Mapper.Sc.ISitecoreContext>();
            //Setup the method to return a model when called.
            iSitecoreContext.Setup(_ => _.GetCurrentItem<Home_Control>()).Returns(model);
            var controllerUnderTest = new HomeBottomContentController(iSitecoreContext.Object);
    
            //Act
            var result = controllerUnderTest.Index() as ViewResult;
    
            //Assert
            Assert.IsNotNull(result);
            Assert.IsNotNull(result.Model);
            //...other assertions.
        }
    }
    

    在动作中创建语境将其与语境紧密结合,几乎不可能模仿。这就是注入显式依赖项的原因

        2
  •  1
  •   Aleksey Shevchenko    7 年前

    public class HomeBottomContentController : GlassController
    {
        private readonly ISitecoreContext _iSitecoreContext;
        public HomeBottomContentController(ISitecoreContext iSitecoreContext)
        {
            _iSitecoreContext = iSitecoreContext;
        }
    
        public override ActionResult Index()
        {
            var model = this.GetCurrentItem();
            return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model);
        }
    
        protected virtual Home_Control GetCurrentItem() 
        {
            return _iSitecoreContext.GetCurrentItem<Home_Control>();
        }
    }
    
    namespace WTW.Feature.HomeBottomContent.Tests
    {
        [TestClass]
        public class UnitTest1
        {
            [TestMethod]
            public void Test_ISitecoreContextInsertion()
            {       
                var iSitecoreContext = Mock.Of<Glass.Mapper.Sc.ISitecoreContext>();
                var controllerUnderTest = new FakeHomeBottomContentController(iSitecoreContext);
                var result = controllerUnderTest.Index() as ViewResult;
                Assert.IsNotNull(result);
            }
        }
    
        public class FakeHomeBottomContentController : HomeBottomContentController 
        {
            public FakeHomeBottomContentController(ISitecoreContext iSitecoreContext) : base(iSitecoreContext) 
            {
            }
    
            protected override Home_Control GetCurrentItem()
            {
                // return instance of Home_Control type
                // e.g.         
                return new Home_Control();
            }
        }
    }