2015-09-28 73 views
2

我正在使用Sitecore.FakeDB爲我的Sitecore編寫單元測試。我想嘲笑RenderingContext,設置我當前項目的渲染參數或數據源。使用Sitecore.FakeDB嘲弄渲染上下文

但是,調用RenderingContext.Current的時候,我的單元測試崩潰,並顯示以下錯誤:

Test method YourAssembly.YourClass.YourTest threw exception: 
System.InvalidOperationException: Attempt to retrieve context object of type 'Sitecore.Mvc.Presentation.RenderingContext' from empty stack. 

是嘲諷通過Sitecore.FakeDB支持RenderingContext

如果不支持,我將抽象的調用RenderingContext使用Marc Duiker's blog

+0

不這麼認爲。項目,安全性,管道和設置似乎是極限。 –

回答

9

如何使用RenderingContext.EnterContext我的代碼了。類似這樣的:

Item datasourceContextItem = db.GetItem("/sitecore/content/some/stuff"); 

using (RenderingContext.EnterContext(new Rendering(), datasourceContextItem)) 
{ 

    IMyViewModelRepository repository = new MyViewModelRepository(); 
    MyController controller = new MyController(repository); 

    ViewResult view = (ViewResult)controller.Index(); 

    ((MyViewModel)view.Model).MyHtmlStringProperty.ToString().Should().Be("some value"); 
} 
3

您可能不需要FakeDb來設置渲染上下文。作爲@gorhal有mentioned,你應該使用RenderingContext.EnterContext()方法:

[Fact] 
public void EnteringSimpleRenderingContext() 
{ 
    using (RenderingContext.EnterContext(new Rendering())) 
    { 
    Assert.NotNull(RenderingContext.Current); 
    } 
} 

如果您需要一些數據源,您可以使用創建一個項目不是純粹的FakeDb

[Fact] 
public void EnteringRenderingContextWithDataSource() 
{ 
    using (var db = new Db { new DbItem("source") }) 
    { 
    var contextItem = db.GetItem("/sitecore/content/source"); 
    using (RenderingContext.EnterContext(new Rendering(), contextItem)) 
    { 
     Assert.NotNull(RenderingContext.Current); 
     Assert.NotNull(RenderingContext.Current.ContextItem); 
    } 
    } 
} 

或FakeDb integratedAutoFixture

[Theory, AutoDbData] 
public void EnteringRenderingContextWithAutoDataSource(Item contextItem) 
{ 
    using (RenderingContext.EnterContext(new Rendering(), contextItem)) 
    { 
    Assert.NotNull(RenderingContext.Current); 
    Assert.NotNull(RenderingContext.Current.ContextItem); 
    } 
} 

internal class AutoDbDataAttribute : AutoDataAttribute 
{ 
    public AutoDbDataAttribute() 
    : base(new Fixture().Customize(
     new Sitecore.FakeDb.AutoFixture.AutoDbCustomization())) 
    { 
    } 
}