C# Glassmapper SitecoreContext单元测试

C# Glassmapper SitecoreContext单元测试,c#,unit-testing,sitecore,glass-mapper,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.Cont

我正在使用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;
}

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

尝试使用Db实例包装您的代码

诸如此类:

[TestCase]
public void FooTest()
{
    using (var db = new Db { })
    {
        var fakeSite = new Sitecore.FakeDb.Sites.FakeSiteContext(new Sitecore.Collections.StringDictionary
        {
            { "name", "website" }, { "database", "web" }
        });
        using (new Sitecore.Sites.SiteContextSwitcher(fakeSite))
        {
            Sitecore.Context.Site.Name.Should().Be("website");
            Sitecore.Context.Site.Database.Name.Should().Be("web");
        }
    }
}

尝试使用Db实例包装您的代码

诸如此类:

[TestCase]
public void FooTest()
{
    using (var db = new Db { })
    {
        var fakeSite = new Sitecore.FakeDb.Sites.FakeSiteContext(new Sitecore.Collections.StringDictionary
        {
            { "name", "website" }, { "database", "web" }
        });
        using (new Sitecore.Sites.SiteContextSwitcher(fakeSite))
        {
            Sitecore.Context.Site.Name.Should().Be("website");
            Sitecore.Context.Site.Database.Name.Should().Be("web");
        }
    }
}

你到底在测试什么?伪造的?Sitecore?看起来单元测试是为了锻炼玻璃而设计的,仅此而已。没有实际的逻辑被运用,没有假设被记录

此外,测试这一点也不奇怪,因为在5行代码中有如此多的依赖项。当您将测试集中在您的代码上时,单元测试实际上要容易得多。没有必要为Sitecore、Glass和FakeDB编写单元测试——这不是你的工作。您需要重新构造此代码,以便依赖项(Glass上下文、开始路径和诊断记录器)通常是
ctor
的处理参数的输入。这样,您就可以控制被测代码的参数,而不是依赖于通过使用静态继承的隐式行为。毫无疑问,Glass中隐藏着一些依赖于HttpContext的代码,这些代码您没有正确地模拟出来,这就是它无法工作的原因。删除对静态成员的调用,而是将这些值传递到代码中,这将允许您在测试代码时轻松地模拟它们,并且您根本不会遇到此类问题


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

您到底在测试什么?伪造的?Sitecore?看起来单元测试是为了锻炼玻璃而设计的,仅此而已。没有实际的逻辑被运用,没有假设被记录

此外,测试这一点也不奇怪,因为在5行代码中有如此多的依赖项。当您将测试集中在您的代码上时,单元测试实际上要容易得多。没有必要为Sitecore、Glass和FakeDB编写单元测试——这不是你的工作。您需要重新构造此代码,以便依赖项(Glass上下文、开始路径和诊断记录器)通常是
ctor
的处理参数的输入。这样,您就可以控制被测代码的参数,而不是依赖于通过使用静态继承的隐式行为。毫无疑问,Glass中隐藏着一些依赖于HttpContext的代码,这些代码您没有正确地模拟出来,这就是它无法工作的原因。删除对静态成员的调用,而是将这些值传递到代码中,这将允许您在测试代码时轻松地模拟它们,并且您根本不会遇到此类问题

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