C# Glassmapper SitecoreContext单元测试
我正在使用Xunit创建一个单元测试,以测试调用SitecoreContext并始终返回null的方法 我正在使用FakeDB作为站点上下文 这是单元测试的方法: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
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的代码,这些代码您没有正确地模拟出来,这就是它无法工作的原因。删除对静态成员的调用,而是将这些值传递到代码中,这将允许您在测试代码时轻松地模拟它们,并且您根本不会遇到此类问题
我强烈建议您完全重新考虑单元测试策略,因为上面写的测试是在浪费精力