2017-09-20 97 views
1

我使用Xunit创建了一个单元测试来测试调用SitecoreContext并始终返回null的方法。Glassmapper SitecoreContext单元测试

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

回答

1

尝试使用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"); 
     } 
    } 
} 
3

正是你在这里测试? FakeDB? Sitecore的?看起来单元测试是为了锻炼玻璃而设计的,仅此而已。没有实际的逻辑被执行,没有任何假设被记录。

此外,由于仅有5行代码中存在如此多的依赖关系,因此难以测试这一点并不奇怪。如果您只将您的测试集中在您的代码上,那么单元测试真的很容易。没有必要为Sitecore,Glass和FakeDB编写单元测试 - 这不是你的工作。您需要重构此代码,以便依赖项(Glass上下文,启动路径和诊断记录器)作为处理的输入 - 通常为您的参数ctor。这样,您就可以控制被测代码的参数,而不是依赖于通过使用静态而继承的隐式行为。毫无疑问,Glass内部的代码依赖于你没有正确嘲笑的HttpContext,这就是为什么它不起作用。除去对静态成员的调用,而是将这些值传递给代码将允许您在代码被测试时轻松地将它们模拟出来,并且根本不会出现这些类型的问题。

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