c# - Glass Mapper Sitecore 上下文单元测试

标签 c# unit-testing sitecore glass-mapper

我正在使用 Xunit 创建单元测试来测试调用 SitecoreContext 并始终返回 null 的方法。

我在站点上下文中使用 FakeDB。

这是单元测试的方法:

public static Model GetModelData(object owner)
{
    try
    {
        using (var context = new SitecoreContext())
        {
            string homePath = Sitecore.Context.Site.ContentStartPath;
            Model = context.GetItem<Model>(string.Format("{0}/Configuration/Model", homePath));
        }
    }
    catch (Exception ex)
    {
        Sitecore.Diagnostics.Log.Error("GetModelData() Exception: " + ex.InnerException, owner);
    }
    return backToTop;
}

我使用 FakeDb 创建了一个伪造的 SiteContext 并调用了该方法。这是我尝试过的:

    var fakeSite = new Sitecore.FakeDb.Sites.FakeSiteContext(new Sitecore.Collections.StringDictionary
    {
        { "name", "fakesite" }, { "database", "master" }, { "rootPath", "/sitecore/content/home" }
    });
    using (new Sitecore.Sites.SiteContextSwitcher(fakeSite))
    {       
        var result = SomeClass.GetModelData(this);
        result.Should().NotBeNull();
    }

调试时,我发现 var 上下文返回 null。有没有办法模拟 Glassmapper SitecoreContext?或者这是不可能的,因为我从该方法中引入了一个新的 SitecoreContext?

最佳答案

你到底在测试什么?假数据库?网站核心?看起来单元测试的目的是为了锻炼 Glass,仅此而已。没有执行任何实际逻辑,也没有记录任何假设。

此外,您在测试时遇到困难也就不足为奇了,因为仅 5 行代码就有如此多的依赖项。当您将测试重点放在您的 代码上时,单元测试真的会容易得多。无需为 Sitecore、Glass 和 FakeDB 编写单元测试——那不是你的工作。您需要重组此代码,以便依赖项(Glass 上下文、启动路径和诊断记录器)通常是处理的输入 - 您的 ctor 的参数。这样您就可以控制被测代码的参数,而不是依赖于您通过使用静态方法继承的隐式行为。毫无疑问,Glass 中埋藏着依赖于 HttpContext 的代码,但您没有正确模拟,这就是它无法正常工作的原因。删除对静态成员的调用并将这些值传递给您的代码将使您能够在代码被测试时轻松地模拟它们,并且您根本不会遇到这类问题。

不过,我强烈建议您完全重新考虑您的单元测试策略,因为上面写的测试是在浪费精力。

关于c# - Glass Mapper Sitecore 上下文单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46320153/

相关文章:

c# - 如何使用 C# 动态更改 XML 节点的属性

c# - 为什么要编译?

unit-testing - 如何用 Jest 模拟导入

asp.net - 无法获取管道: loadVisitor (domain: )

sitecore - 如何使用 Sitecore 包含文件修补属性值

sitecore - TDS 同步环境之间的站点核心成员资格和安全性,为每个环境指定部署的项目

c# - 这个图案有名字吗? (C# 编译时类型安全,具有 "params"不同类型的参数)

c# - C# 中的通用 foreach 循环

python - 如何 monkeypatch 内置函数 datetime.datetime.now?

unit-testing - 有没有像糟糕的单元测试这样的事情?