2017-09-20 46 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,這就是爲什麼它不起作用。除去對靜態成員的調用,而是將這些值傳遞給代碼將允許您在代碼被測試時輕鬆地將它們模擬出來,並且根本不會出現這些類型的問題。

我強烈建議你完全重新考慮你的單元測試策略,因爲測試如上面寫的浪費了精力。