gpt4 book ai didi

c# - 如何对返回采用模型的 View 的 GlassController 操作进行单元测试

转载 作者:行者123 更新时间:2023-11-30 16:42:44 25 4
gpt4 key购买 nike

我是一名 sitecore 开发人员,我想创建一个示例 sitecore helix 单元测试项目来测试我们的“HomeBottomContentController” Controller :

    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);
}
}

我创建了一个 WTW.Feature.HomeBottomContent.Tests 项目,目的是使用 helix 单元测试来测试整个组件。在其中我有一个包含以下内容的 UnitTest1.cs 文件:

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);
}
}
}

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

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

我的问题是,我究竟该如何更改此代码以确保该行中的“模型”不会变为空值?我如何在 _iSitecoreContext 的单元测试代码中“模拟”一个项目,以便它有一个“Home_Control”模板,其字段具有合法值?这甚至是正确的方法吗?我发现的大多数在线资源都没有类似的场景,我正在寻找可能的最短代码。

我遇到的另一个问题是,假设 SitecoreContext 是在 Index() 方法内部声明的,而不是在像上面那样的 HomeBottomContentController 构造函数?有没有办法从 [TestMethod] 执行此操作,或者我们必须将 SitecoreContext 作为参数发送到 HomeBottomContentController 构造函数或 Index() 方法中?

public override ActionResult Index()
{
var context = new SitecoreContext();
var model = context.GetCurrentItem<Home_Control>();
return View("~/Views/HomeBottomContent/HomeBottomContent.cshtml", model);
}

最佳答案

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

[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.
}
}

更新

在 Action 中创建上下文会将其与上下文紧密耦合,使其几乎不可能被模拟。这就是注入(inject)显式依赖项的原因

关于c# - 如何对返回采用模型的 View 的 GlassController 操作进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186187/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com