2015-09-28 2 views
2

Я использую Sitecore.FakeDB для записи unittests для моего Sitecore. Я хотел бы высмеять RenderingContext, чтобы установить параметры визуализации или источник данных моего текущего элемента.Mocking RenderingContext using Sitecore.FakeDB

Однако при вызове RenderingContext.Current, мой UnitTest падает со следующей ошибкой:

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

ли насмешливый RenderingContext поддерживаемого Sitecore.FakeDB?

Если это не поддерживается, я абстрактные призывы 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); 
    } 
} 

Если вам нужно некоторые DataSource, вы можете создать элемент, используя либо чистый 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 integrated с AutoFixture :

[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())) 
    { 
    } 
}