Updating per comments
This commit is contained in:
parent
23a7aa813d
commit
0720177243
|
|
@ -11,7 +11,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Default implementation for <see cref="IView"/> that executes one or more <see cref="IRazorPage"/>
|
/// Default implementation for <see cref="IView"/> that executes one or more <see cref="IRazorPage"/>
|
||||||
/// instances as part of view rendering.
|
/// as parts of its exeuction.
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public class RazorView : IView
|
public class RazorView : IView
|
||||||
{
|
{
|
||||||
|
|
@ -19,8 +19,6 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
private readonly IRazorPageActivator _pageActivator;
|
private readonly IRazorPageActivator _pageActivator;
|
||||||
private readonly IViewStartProvider _viewStartProvider;
|
private readonly IViewStartProvider _viewStartProvider;
|
||||||
private IPageExecutionListenerFeature _pageExecutionFeature;
|
private IPageExecutionListenerFeature _pageExecutionFeature;
|
||||||
private IRazorPage _razorPage;
|
|
||||||
private bool _isPartial;
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Initializes a new instance of RazorView
|
/// Initializes a new instance of RazorView
|
||||||
|
|
@ -28,52 +26,52 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
/// <param name="pageFactory">The page factory used to instantiate layout and _ViewStart pages.</param>
|
/// <param name="pageFactory">The page factory used to instantiate layout and _ViewStart pages.</param>
|
||||||
/// <param name="pageActivator">The <see cref="IRazorPageActivator"/> used to activate pages.</param>
|
/// <param name="pageActivator">The <see cref="IRazorPageActivator"/> used to activate pages.</param>
|
||||||
/// <param name="viewStartProvider">The <see cref="IViewStartProvider"/> used for discovery of _ViewStart
|
/// <param name="viewStartProvider">The <see cref="IViewStartProvider"/> used for discovery of _ViewStart
|
||||||
|
/// <param name="razorPage">The <see cref="IRazorPage"/> instance to execute.</param>
|
||||||
|
/// <param name="isPartial">Determines if the view is to be executed as a partial.</param>
|
||||||
/// pages</param>
|
/// pages</param>
|
||||||
public RazorView(IRazorPageFactory pageFactory,
|
public RazorView(IRazorPageFactory pageFactory,
|
||||||
IRazorPageActivator pageActivator,
|
IRazorPageActivator pageActivator,
|
||||||
IViewStartProvider viewStartProvider)
|
IViewStartProvider viewStartProvider,
|
||||||
|
IRazorPage razorPage,
|
||||||
|
bool isPartial
|
||||||
|
)
|
||||||
{
|
{
|
||||||
_pageFactory = pageFactory;
|
_pageFactory = pageFactory;
|
||||||
_pageActivator = pageActivator;
|
_pageActivator = pageActivator;
|
||||||
_viewStartProvider = viewStartProvider;
|
_viewStartProvider = viewStartProvider;
|
||||||
|
RazorPage = razorPage;
|
||||||
|
IsPartial = isPartial;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets <see cref="IRazorPage"/> instance that the views executes on.
|
||||||
|
/// </summary>
|
||||||
|
public IRazorPage RazorPage { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a value that determines if the view is executed as a partial.
|
||||||
|
/// </summary>
|
||||||
|
/// <inheritdoc />
|
||||||
|
public bool IsPartial { get; }
|
||||||
|
|
||||||
|
|
||||||
private bool EnableInstrumentation
|
private bool EnableInstrumentation
|
||||||
{
|
{
|
||||||
get { return _pageExecutionFeature != null; }
|
get { return _pageExecutionFeature != null; }
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Contextualizes the current instance of the <see cref="RazorView"/> providing it with the
|
|
||||||
/// <see cref="IRazorPage"/> to execute.
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="razorPage">The <see cref="IRazorPage"/> instance to execute.</param>
|
|
||||||
/// <param name="isPartial">Determines if the view is to be executed as a partial.</param>
|
|
||||||
public virtual void Contextualize([NotNull] IRazorPage razorPage,
|
|
||||||
bool isPartial)
|
|
||||||
{
|
|
||||||
_razorPage = razorPage;
|
|
||||||
_isPartial = isPartial;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual async Task RenderAsync([NotNull] ViewContext context)
|
public virtual async Task RenderAsync([NotNull] ViewContext context)
|
||||||
{
|
{
|
||||||
if (_razorPage == null)
|
|
||||||
{
|
|
||||||
var message = Resources.FormatViewMustBeContextualized(nameof(Contextualize), nameof(RenderAsync));
|
|
||||||
throw new InvalidOperationException(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
_pageExecutionFeature = context.HttpContext.GetFeature<IPageExecutionListenerFeature>();
|
_pageExecutionFeature = context.HttpContext.GetFeature<IPageExecutionListenerFeature>();
|
||||||
|
|
||||||
if (_isPartial)
|
if (IsPartial)
|
||||||
{
|
{
|
||||||
await RenderPartialAsync(context);
|
await RenderPartialAsync(context);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var bodyWriter = await RenderPageAsync(_razorPage, context, executeViewStart: true);
|
var bodyWriter = await RenderPageAsync(RazorPage, context, executeViewStart: true);
|
||||||
await RenderLayoutAsync(context, bodyWriter);
|
await RenderLayoutAsync(context, bodyWriter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -84,14 +82,14 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
// When instrmenting, we need to Decorate the output in an instrumented writer which
|
// When instrmenting, we need to Decorate the output in an instrumented writer which
|
||||||
// RenderPageAsync does.
|
// RenderPageAsync does.
|
||||||
var bodyWriter = await RenderPageAsync(_razorPage, context, executeViewStart: false);
|
var bodyWriter = await RenderPageAsync(RazorPage, context, executeViewStart: false);
|
||||||
await bodyWriter.CopyToAsync(context.Writer);
|
await bodyWriter.CopyToAsync(context.Writer);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// For the non-instrumented case, we don't need to buffer contents. For Html.Partial, the writer is
|
// For the non-instrumented case, we don't need to buffer contents. For Html.Partial, the writer is
|
||||||
// an in memory writer and for Partial views, we directly write to the Response.
|
// an in memory writer and for Partial views, we directly write to the Response.
|
||||||
await RenderPageCoreAsync(_razorPage, context);
|
await RenderPageCoreAsync(RazorPage, context);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -142,7 +140,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
|
|
||||||
private async Task RenderPageCoreAsync(IRazorPage page, ViewContext context)
|
private async Task RenderPageCoreAsync(IRazorPage page, ViewContext context)
|
||||||
{
|
{
|
||||||
page.IsPartial = _isPartial;
|
page.IsPartial = IsPartial;
|
||||||
page.ViewContext = context;
|
page.ViewContext = context;
|
||||||
if (EnableInstrumentation)
|
if (EnableInstrumentation)
|
||||||
{
|
{
|
||||||
|
|
@ -155,7 +153,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
|
|
||||||
private async Task RenderViewStartAsync(ViewContext context)
|
private async Task RenderViewStartAsync(ViewContext context)
|
||||||
{
|
{
|
||||||
var viewStarts = _viewStartProvider.GetViewStartPages(_razorPage.Path);
|
var viewStarts = _viewStartProvider.GetViewStartPages(RazorPage.Path);
|
||||||
|
|
||||||
string layout = null;
|
string layout = null;
|
||||||
foreach (var viewStart in viewStarts)
|
foreach (var viewStart in viewStarts)
|
||||||
|
|
@ -167,7 +165,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
}
|
}
|
||||||
|
|
||||||
// Copy over interesting properties from the ViewStart page to the entry page.
|
// Copy over interesting properties from the ViewStart page to the entry page.
|
||||||
_razorPage.Layout = layout;
|
RazorPage.Layout = layout;
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task RenderLayoutAsync(ViewContext context,
|
private async Task RenderLayoutAsync(ViewContext context,
|
||||||
|
|
@ -175,7 +173,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
// A layout page can specify another layout page. We'll need to continue
|
// A layout page can specify another layout page. We'll need to continue
|
||||||
// looking for layout pages until they're no longer specified.
|
// looking for layout pages until they're no longer specified.
|
||||||
var previousPage = _razorPage;
|
var previousPage = RazorPage;
|
||||||
while (!string.IsNullOrEmpty(previousPage.Layout))
|
while (!string.IsNullOrEmpty(previousPage.Layout))
|
||||||
{
|
{
|
||||||
if (!bodyWriter.IsBuffering)
|
if (!bodyWriter.IsBuffering)
|
||||||
|
|
|
||||||
|
|
@ -34,7 +34,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
};
|
};
|
||||||
|
|
||||||
private readonly IRazorPageFactory _pageFactory;
|
private readonly IRazorPageFactory _pageFactory;
|
||||||
private readonly IRazorViewFactory _pageViewFactory;
|
private readonly IRazorViewFactory _viewFactory;
|
||||||
private readonly IReadOnlyList<IViewLocationExpander> _viewLocationExpanders;
|
private readonly IReadOnlyList<IViewLocationExpander> _viewLocationExpanders;
|
||||||
private readonly IViewLocationCache _viewLocationCache;
|
private readonly IViewLocationCache _viewLocationCache;
|
||||||
|
|
||||||
|
|
@ -43,12 +43,12 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="pageFactory">The page factory used for creating <see cref="IRazorPage"/> instances.</param>
|
/// <param name="pageFactory">The page factory used for creating <see cref="IRazorPage"/> instances.</param>
|
||||||
public RazorViewEngine(IRazorPageFactory pageFactory,
|
public RazorViewEngine(IRazorPageFactory pageFactory,
|
||||||
IRazorViewFactory pageViewFactory,
|
IRazorViewFactory viewFactory,
|
||||||
IViewLocationExpanderProvider viewLocationExpanderProvider,
|
IViewLocationExpanderProvider viewLocationExpanderProvider,
|
||||||
IViewLocationCache viewLocationCache)
|
IViewLocationCache viewLocationCache)
|
||||||
{
|
{
|
||||||
_pageFactory = pageFactory;
|
_pageFactory = pageFactory;
|
||||||
_pageViewFactory = pageViewFactory;
|
_viewFactory = viewFactory;
|
||||||
_viewLocationExpanders = viewLocationExpanderProvider.ViewLocationExpanders;
|
_viewLocationExpanders = viewLocationExpanderProvider.ViewLocationExpanders;
|
||||||
_viewLocationCache = viewLocationCache;
|
_viewLocationCache = viewLocationCache;
|
||||||
}
|
}
|
||||||
|
|
@ -197,7 +197,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
|
|
||||||
var services = actionContext.HttpContext.RequestServices;
|
var services = actionContext.HttpContext.RequestServices;
|
||||||
|
|
||||||
var view = _pageViewFactory.GetView(page, partial);
|
var view = _viewFactory.GetView(page, partial);
|
||||||
|
|
||||||
return ViewEngineResult.Found(viewName, view);
|
return ViewEngineResult.Found(viewName, view);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,6 +5,10 @@ using Microsoft.AspNet.Mvc.Rendering;
|
||||||
|
|
||||||
namespace Microsoft.AspNet.Mvc.Razor
|
namespace Microsoft.AspNet.Mvc.Razor
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// Represents the default <see cref="IRazorViewFactory"/> implementation that creates
|
||||||
|
/// <see cref="RazorView"/> instances with a given <see cref="IRazorPage"/>.
|
||||||
|
/// </summary>
|
||||||
public class RazorViewFactory : IRazorViewFactory
|
public class RazorViewFactory : IRazorViewFactory
|
||||||
{
|
{
|
||||||
private readonly IRazorPageActivator _pageActivator;
|
private readonly IRazorPageActivator _pageActivator;
|
||||||
|
|
@ -19,8 +23,8 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
/// <param name="viewStartProvider">The <see cref="IViewStartProvider"/> used for discovery of _ViewStart
|
/// <param name="viewStartProvider">The <see cref="IViewStartProvider"/> used for discovery of _ViewStart
|
||||||
/// pages</param>
|
/// pages</param>
|
||||||
public RazorViewFactory(IRazorPageFactory pageFactory,
|
public RazorViewFactory(IRazorPageFactory pageFactory,
|
||||||
IRazorPageActivator pageActivator,
|
IRazorPageActivator pageActivator,
|
||||||
IViewStartProvider viewStartProvider)
|
IViewStartProvider viewStartProvider)
|
||||||
{
|
{
|
||||||
_pageFactory = pageFactory;
|
_pageFactory = pageFactory;
|
||||||
_pageActivator = pageActivator;
|
_pageActivator = pageActivator;
|
||||||
|
|
@ -30,10 +34,7 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public IView GetView([NotNull] IRazorPage page, bool isPartial)
|
public IView GetView([NotNull] IRazorPage page, bool isPartial)
|
||||||
{
|
{
|
||||||
var razorView = new RazorView(_pageFactory, _pageActivator, _viewStartProvider);
|
var razorView = new RazorView(_pageFactory, _pageActivator, _viewStartProvider, page, isPartial);
|
||||||
|
|
||||||
razorView.Contextualize(page, isPartial);
|
|
||||||
|
|
||||||
return razorView;
|
return razorView;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -83,6 +83,32 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
Assert.False(result.Success);
|
Assert.False(result.Success);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void FindPartialView_ReturnsRazorView_IfLookupWasSuccessful()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var pageFactory = new Mock<IRazorPageFactory>();
|
||||||
|
var viewFactory = new Mock<IRazorViewFactory>();
|
||||||
|
var page = Mock.Of<IRazorPage>();
|
||||||
|
|
||||||
|
pageFactory.Setup(p => p.CreateInstance(It.IsAny<string>()))
|
||||||
|
.Returns(Mock.Of<IRazorPage>());
|
||||||
|
viewFactory.Setup(p => p.GetView(It.IsAny<IRazorPage>(), It.IsAny<bool>()))
|
||||||
|
.Returns(Mock.Of<IView>()).Verifiable();
|
||||||
|
|
||||||
|
var viewEngine = CreateViewEngine(pageFactory.Object, viewFactory.Object);
|
||||||
|
var context = GetActionContext(_controllerTestContext);
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var result = viewEngine.FindPartialView(context, "test-view");
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.True(result.Success);
|
||||||
|
Assert.IsAssignableFrom<IView>(result.View);
|
||||||
|
Assert.Equal("/Views/bar/test-view.cshtml", result.ViewName);
|
||||||
|
viewFactory.Verify();
|
||||||
|
}
|
||||||
|
|
||||||
[Theory]
|
[Theory]
|
||||||
[InlineData(null)]
|
[InlineData(null)]
|
||||||
[InlineData("")]
|
[InlineData("")]
|
||||||
|
|
@ -216,7 +242,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
pageFactory.Setup(p => p.CreateInstance(It.IsAny<string>()))
|
pageFactory.Setup(p => p.CreateInstance(It.IsAny<string>()))
|
||||||
.Returns(Mock.Of<IRazorPage>());
|
.Returns(Mock.Of<IRazorPage>());
|
||||||
viewFactory.Setup(p => p.GetView(It.IsAny<IRazorPage>(), It.IsAny<bool>()))
|
viewFactory.Setup(p => p.GetView(It.IsAny<IRazorPage>(), It.IsAny<bool>()))
|
||||||
.Returns(Mock.Of<IView>());
|
.Returns(Mock.Of<IView>()).Verifiable();
|
||||||
|
|
||||||
var viewEngine = CreateViewEngine(pageFactory.Object, viewFactory.Object);
|
var viewEngine = CreateViewEngine(pageFactory.Object, viewFactory.Object);
|
||||||
var context = GetActionContext(_controllerTestContext);
|
var context = GetActionContext(_controllerTestContext);
|
||||||
|
|
@ -228,6 +254,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
Assert.True(result.Success);
|
Assert.True(result.Success);
|
||||||
Assert.IsAssignableFrom<IView>(result.View);
|
Assert.IsAssignableFrom<IView>(result.View);
|
||||||
Assert.Equal("/Views/bar/test-view.cshtml", result.ViewName);
|
Assert.Equal("/Views/bar/test-view.cshtml", result.ViewName);
|
||||||
|
viewFactory.Verify();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
|
@ -356,7 +383,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.True(result.Success);
|
Assert.True(result.Success);
|
||||||
Assert.IsAssignableFrom<RazorView>(result.View);
|
Assert.IsAssignableFrom<IView>(result.View);
|
||||||
pageFactory.Verify();
|
pageFactory.Verify();
|
||||||
expander1.Verify();
|
expander1.Verify();
|
||||||
expander2.Verify();
|
expander2.Verify();
|
||||||
|
|
@ -445,8 +472,7 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
|
|
||||||
var viewFactory = new Mock<IRazorViewFactory>();
|
var viewFactory = new Mock<IRazorViewFactory>();
|
||||||
viewFactory.Setup(p => p.GetView(It.IsAny<IRazorPage>(), It.IsAny<bool>()))
|
viewFactory.Setup(p => p.GetView(It.IsAny<IRazorPage>(), It.IsAny<bool>())).Returns(Mock.Of<IView>());
|
||||||
.Returns(Mock.Of<IView>());
|
|
||||||
|
|
||||||
var cacheMock = new Mock<IViewLocationCache>();
|
var cacheMock = new Mock<IViewLocationCache>();
|
||||||
cacheMock.Setup(c => c.Get(It.IsAny<ViewLocationExpanderContext>()))
|
cacheMock.Setup(c => c.Get(It.IsAny<ViewLocationExpanderContext>()))
|
||||||
|
|
@ -463,9 +489,9 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
|
|
||||||
var viewEngine = CreateViewEngine(pageFactory.Object,
|
var viewEngine = CreateViewEngine(pageFactory.Object,
|
||||||
viewFactory.Object,
|
viewFactory.Object,
|
||||||
new[] { expander.Object },
|
expanders: new[] { expander.Object },
|
||||||
cacheMock.Object);
|
cache: cacheMock.Object);
|
||||||
var context = GetActionContext(_controllerTestContext);
|
var context = GetActionContext(_controllerTestContext, viewFactory.Object);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var result = viewEngine.FindView(context, "baz");
|
var result = viewEngine.FindView(context, "baz");
|
||||||
|
|
@ -520,8 +546,6 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
{
|
{
|
||||||
var httpContext = new DefaultHttpContext();
|
var httpContext = new DefaultHttpContext();
|
||||||
var serviceProvider = new Mock<IServiceProvider>();
|
var serviceProvider = new Mock<IServiceProvider>();
|
||||||
serviceProvider.Setup(p => p.GetService(typeof(IRazorViewFactory)))
|
|
||||||
.Returns(razorViewFactory ?? Mock.Of<IRazorViewFactory>());
|
|
||||||
|
|
||||||
httpContext.RequestServices = serviceProvider.Object;
|
httpContext.RequestServices = serviceProvider.Object;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -14,6 +14,46 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
{
|
{
|
||||||
public class RazorViewFactoryTest
|
public class RazorViewFactoryTest
|
||||||
{
|
{
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetView_SetsIsPartial()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var factory = new RazorViewFactory(
|
||||||
|
Mock.Of<IRazorPageFactory>(),
|
||||||
|
Mock.Of<IRazorPageActivator>(),
|
||||||
|
Mock.Of<IViewStartProvider>());
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var viewPartial = factory.GetView(Mock.Of<IRazorPage>(), isPartial: true) as RazorView;
|
||||||
|
var view = factory.GetView(Mock.Of<IRazorPage>(), isPartial: false) as RazorView;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(viewPartial);
|
||||||
|
Assert.True(viewPartial.IsPartial);
|
||||||
|
Assert.NotNull(view);
|
||||||
|
Assert.True(!view.IsPartial);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Fact]
|
||||||
|
public void GetView_SetsRazorPage()
|
||||||
|
{
|
||||||
|
// Arrange
|
||||||
|
var factory = new RazorViewFactory(
|
||||||
|
Mock.Of<IRazorPageFactory>(),
|
||||||
|
Mock.Of<IRazorPageActivator>(),
|
||||||
|
Mock.Of<IViewStartProvider>());
|
||||||
|
|
||||||
|
var page = Mock.Of<IRazorPage>();
|
||||||
|
|
||||||
|
// Act
|
||||||
|
var view = factory.GetView(page, isPartial: false) as RazorView;
|
||||||
|
|
||||||
|
// Assert
|
||||||
|
Assert.NotNull(view);
|
||||||
|
Assert.Same(view.RazorPage, page);
|
||||||
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void GetView_ReturnsRazorView()
|
public void GetView_ReturnsRazorView()
|
||||||
{
|
{
|
||||||
|
|
@ -24,71 +64,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test
|
||||||
Mock.Of<IViewStartProvider>());
|
Mock.Of<IViewStartProvider>());
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
var view = factory.GetView(Mock.Of<IRazorPage>(), true);
|
var view = factory.GetView(Mock.Of<IRazorPage>(), isPartial: true);
|
||||||
|
|
||||||
// Assert
|
// Assert
|
||||||
Assert.IsType<RazorView>(view);
|
Assert.IsType<RazorView>(view);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task RenderAsync_ContextualizeMustBeInvoked()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var page = new TestableRazorPage(v => { });
|
|
||||||
|
|
||||||
var factory = new RazorViewFactory(
|
|
||||||
Mock.Of<IRazorPageFactory>(),
|
|
||||||
Mock.Of<IRazorPageActivator>(),
|
|
||||||
CreateViewStartProvider());
|
|
||||||
|
|
||||||
// Act
|
|
||||||
var view = factory.GetView(page, true);
|
|
||||||
|
|
||||||
// Assert
|
|
||||||
var viewContext = CreateViewContext(view);
|
|
||||||
await Assert.DoesNotThrowAsync(() => view.RenderAsync(viewContext));
|
|
||||||
}
|
|
||||||
|
|
||||||
private static IViewStartProvider CreateViewStartProvider()
|
|
||||||
{
|
|
||||||
var viewStartPages = new IRazorPage[0];
|
|
||||||
var viewStartProvider = new Mock<IViewStartProvider>();
|
|
||||||
viewStartProvider.Setup(v => v.GetViewStartPages(It.IsAny<string>()))
|
|
||||||
.Returns(viewStartPages);
|
|
||||||
|
|
||||||
return viewStartProvider.Object;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static ViewContext CreateViewContext(IView view)
|
|
||||||
{
|
|
||||||
var httpContext = new DefaultHttpContext();
|
|
||||||
var actionContext = new ActionContext(httpContext, routeData: null, actionDescriptor: null);
|
|
||||||
return new ViewContext(
|
|
||||||
actionContext,
|
|
||||||
view,
|
|
||||||
new ViewDataDictionary(new EmptyModelMetadataProvider()),
|
|
||||||
new StringWriter());
|
|
||||||
}
|
|
||||||
|
|
||||||
private class TestableRazorPage : RazorPage
|
|
||||||
{
|
|
||||||
private readonly Action<TestableRazorPage> _executeAction;
|
|
||||||
|
|
||||||
public TestableRazorPage(Action<TestableRazorPage> executeAction)
|
|
||||||
{
|
|
||||||
_executeAction = executeAction;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void RenderBodyPublic()
|
|
||||||
{
|
|
||||||
Write(RenderBody());
|
|
||||||
}
|
|
||||||
|
|
||||||
public override Task ExecuteAsync()
|
|
||||||
{
|
|
||||||
_executeAction(this);
|
|
||||||
return Task.FromResult(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -18,23 +18,6 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
private const string LayoutPath = "~/Shared/_Layout.cshtml";
|
private const string LayoutPath = "~/Shared/_Layout.cshtml";
|
||||||
private readonly RenderAsyncDelegate _nullRenderAsyncDelegate = async writer => { };
|
private readonly RenderAsyncDelegate _nullRenderAsyncDelegate = async writer => { };
|
||||||
|
|
||||||
[Fact]
|
|
||||||
public async Task RenderAsync_ThrowsIfContextualizeHasNotBeenInvoked()
|
|
||||||
{
|
|
||||||
// Arrange
|
|
||||||
var page = new TestableRazorPage(v => { });
|
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
|
||||||
Mock.Of<IRazorPageActivator>(),
|
|
||||||
CreateViewStartProvider());
|
|
||||||
var viewContext = CreateViewContext(view);
|
|
||||||
var expected = viewContext.Writer;
|
|
||||||
|
|
||||||
// Act and Assert
|
|
||||||
var ex = await Assert.ThrowsAsync<InvalidOperationException>(() => view.RenderAsync(viewContext));
|
|
||||||
Assert.Equal("The 'Contextualize' method must be called before 'RenderAsync' can be invoked.",
|
|
||||||
ex.Message);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public async Task RenderAsync_AsPartial_DoesNotBufferOutput()
|
public async Task RenderAsync_AsPartial_DoesNotBufferOutput()
|
||||||
{
|
{
|
||||||
|
|
@ -47,8 +30,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
});
|
});
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: true);
|
page,
|
||||||
|
isPartial: true);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
var expected = viewContext.Writer;
|
var expected = viewContext.Writer;
|
||||||
|
|
||||||
|
|
@ -71,11 +55,12 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
Assert.Same(viewData, v.ViewContext.ViewData);
|
Assert.Same(viewData, v.ViewContext.ViewData);
|
||||||
});
|
});
|
||||||
var activator = new Mock<IRazorPageActivator>();
|
var activator = new Mock<IRazorPageActivator>();
|
||||||
|
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
activator.Object,
|
activator.Object,
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: true);
|
page,
|
||||||
|
isPartial: true);
|
||||||
|
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
var expectedWriter = viewContext.Writer;
|
var expectedWriter = viewContext.Writer;
|
||||||
activator.Setup(a => a.Activate(page, It.IsAny<ViewContext>()))
|
activator.Setup(a => a.Activate(page, It.IsAny<ViewContext>()))
|
||||||
|
|
@ -104,8 +89,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
activator.Object,
|
activator.Object,
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: true);
|
page,
|
||||||
|
isPartial: true);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -126,8 +112,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
var viewStartProvider = CreateViewStartProvider();
|
var viewStartProvider = CreateViewStartProvider();
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
viewStartProvider);
|
viewStartProvider,
|
||||||
view.Contextualize(page, isPartial: true);
|
page,
|
||||||
|
isPartial: true);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -150,8 +137,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
});
|
});
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
var original = viewContext.Writer;
|
var original = viewContext.Writer;
|
||||||
|
|
||||||
|
|
@ -173,8 +161,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
});
|
});
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
var original = viewContext.Writer;
|
var original = viewContext.Writer;
|
||||||
|
|
||||||
|
|
@ -198,9 +187,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
activator.Object,
|
activator.Object,
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -240,8 +229,9 @@ namespace Microsoft.AspNet.Mvc.Razor
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
activator.Object,
|
activator.Object,
|
||||||
CreateViewStartProvider(viewStart1, viewStart2));
|
CreateViewStartProvider(viewStart1, viewStart2),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -294,8 +284,9 @@ foot-content";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
activator.Object,
|
activator.Object,
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -327,8 +318,9 @@ foot-content";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act and Assert
|
// Act and Assert
|
||||||
|
|
@ -353,8 +345,9 @@ foot-content";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act and Assert
|
// Act and Assert
|
||||||
|
|
@ -404,8 +397,9 @@ body-content";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -450,8 +444,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -494,8 +489,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -520,8 +516,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act and Assert
|
// Act and Assert
|
||||||
|
|
@ -558,8 +555,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act and Assert
|
// Act and Assert
|
||||||
|
|
@ -630,8 +628,9 @@ section-content-2";
|
||||||
.Verifiable();
|
.Verifiable();
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
viewStartProvider.Object);
|
viewStartProvider.Object,
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
viewContext.HttpContext.SetFeature<IPageExecutionListenerFeature>(feature.Object);
|
viewContext.HttpContext.SetFeature<IPageExecutionListenerFeature>(feature.Object);
|
||||||
|
|
||||||
|
|
@ -673,8 +672,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
Mock.Of<IViewStartProvider>());
|
Mock.Of<IViewStartProvider>(),
|
||||||
view.Contextualize(page, isPartial: true);
|
page,
|
||||||
|
isPartial: true);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
viewContext.Writer = writer;
|
viewContext.Writer = writer;
|
||||||
viewContext.HttpContext.SetFeature<IPageExecutionListenerFeature>(feature.Object);
|
viewContext.HttpContext.SetFeature<IPageExecutionListenerFeature>(feature.Object);
|
||||||
|
|
@ -703,8 +703,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
Mock.Of<IViewStartProvider>());
|
Mock.Of<IViewStartProvider>(),
|
||||||
view.Contextualize(page, isPartial);
|
page,
|
||||||
|
isPartial);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -741,8 +742,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory,
|
var view = new RazorView(pageFactory,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider(viewStart1, viewStart2));
|
CreateViewStartProvider(viewStart1, viewStart2),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -777,8 +779,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory,
|
var view = new RazorView(pageFactory,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider(viewStart1, viewStart2));
|
CreateViewStartProvider(viewStart1, viewStart2),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -816,8 +819,9 @@ section-content-2";
|
||||||
|
|
||||||
var view = new RazorView(pageFactory.Object,
|
var view = new RazorView(pageFactory.Object,
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider(viewStart));
|
CreateViewStartProvider(viewStart),
|
||||||
view.Contextualize(page, isPartial: false);
|
page,
|
||||||
|
isPartial: false);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
@ -840,8 +844,9 @@ section-content-2";
|
||||||
});
|
});
|
||||||
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
var view = new RazorView(Mock.Of<IRazorPageFactory>(),
|
||||||
Mock.Of<IRazorPageActivator>(),
|
Mock.Of<IRazorPageActivator>(),
|
||||||
CreateViewStartProvider());
|
CreateViewStartProvider(),
|
||||||
view.Contextualize(page, isPartial: true);
|
page,
|
||||||
|
isPartial: true);
|
||||||
var viewContext = CreateViewContext(view);
|
var viewContext = CreateViewContext(view);
|
||||||
|
|
||||||
// Act
|
// Act
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue