From 47d227cbf2537d3357ed213677826221ec3978ad Mon Sep 17 00:00:00 2001 From: Pranav K Date: Mon, 14 Jul 2014 19:13:09 -0700 Subject: [PATCH] Modify FindView and FindPartialView to accept ActionContext Fixes #787 --- .../ActionResults/ViewResult.cs | 7 +-- .../Rendering/CompositeViewEngine.cs | 8 +-- .../Rendering/Html/HtmlHelper.cs | 2 +- .../Rendering/Html/TemplateRenderer.cs | 3 +- .../Rendering/IViewEngine.cs | 23 +++++-- .../ViewComponents/ViewViewComponentResult.cs | 4 +- .../RazorViewEngine.cs | 35 +++++++---- .../ViewEngineDscriptorExtensionsTest.cs | 4 +- .../Rendering/CompositeViewEngineTest.cs | 62 +++++++++++-------- .../Rendering/DefaultDisplayTemplatesTests.cs | 10 +-- .../Rendering/DefaultEditorTemplatesTests.cs | 10 +-- .../Rendering/DefaultTemplatesUtilities.cs | 2 +- .../DefaultViewEngineProviderTest.cs | 4 +- .../Rendering/ViewEngineDescriptorTest.cs | 4 +- .../ViewResultTest.cs | 25 ++++---- .../RazorViewEngineTest.cs | 58 +++++++++++------ .../CompositeViewEngine/TestViewEngine.cs | 6 +- 17 files changed, 159 insertions(+), 108 deletions(-) diff --git a/src/Microsoft.AspNet.Mvc.Core/ActionResults/ViewResult.cs b/src/Microsoft.AspNet.Mvc.Core/ActionResults/ViewResult.cs index 7964955aa1..4b41874026 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ActionResults/ViewResult.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ActionResults/ViewResult.cs @@ -26,7 +26,7 @@ namespace Microsoft.AspNet.Mvc var viewEngine = ViewEngine ?? context.HttpContext.RequestServices.GetService(); var viewName = ViewName ?? context.ActionDescriptor.Name; - var view = FindView(viewEngine, context.RouteData.Values, viewName); + var view = FindView(viewEngine, context, viewName); using (view as IDisposable) { @@ -52,10 +52,7 @@ namespace Microsoft.AspNet.Mvc } } - private static IView FindView( - [NotNull] IViewEngine viewEngine, - [NotNull] IDictionary context, - [NotNull] string viewName) + private static IView FindView(IViewEngine viewEngine, ActionContext context, string viewName) { var result = viewEngine.FindView(context, viewName); if (!result.Success) diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/CompositeViewEngine.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/CompositeViewEngine.cs index 79fe458eb4..3e7d5d8e94 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/CompositeViewEngine.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/CompositeViewEngine.cs @@ -1,7 +1,6 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System; using System.Collections.Generic; using System.Linq; @@ -21,20 +20,20 @@ namespace Microsoft.AspNet.Mvc.Rendering public IReadOnlyList ViewEngines { get; private set; } /// - public ViewEngineResult FindPartialView([NotNull] IDictionary context, + public ViewEngineResult FindPartialView([NotNull] ActionContext context, [NotNull] string partialViewName) { return FindView(context, partialViewName, partial: true); } /// - public ViewEngineResult FindView([NotNull] IDictionary context, + public ViewEngineResult FindView([NotNull] ActionContext context, [NotNull] string viewName) { return FindView(context, viewName, partial: false); } - private ViewEngineResult FindView(IDictionary context, + private ViewEngineResult FindView(ActionContext context, string viewName, bool partial) { @@ -48,6 +47,7 @@ namespace Microsoft.AspNet.Mvc.Rendering { return result; } + searchedLocations = searchedLocations.Concat(result.SearchedLocations); } diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs index 3c54f8431f..d75be99e78 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/HtmlHelper.cs @@ -381,7 +381,7 @@ namespace Microsoft.AspNet.Mvc.Rendering var newViewData = new ViewDataDictionary(baseViewData, model); - var viewEngineResult = _viewEngine.FindPartialView(ViewContext.RouteData.Values, partialViewName); + var viewEngineResult = _viewEngine.FindPartialView(ViewContext, partialViewName); if (!viewEngineResult.Success) { var locations = string.Empty; diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/TemplateRenderer.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/TemplateRenderer.cs index c4aeac0506..d4cca1a18e 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/TemplateRenderer.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/Html/TemplateRenderer.cs @@ -88,8 +88,7 @@ namespace Microsoft.AspNet.Mvc.Rendering { var fullViewName = modeViewPath + "/" + viewName; - // Forcing synchronous behavior so users don't have to await templates. - var viewEngineResult = _viewEngine.FindPartialView(_viewContext.RouteData.Values, fullViewName); + var viewEngineResult = _viewEngine.FindPartialView(_viewContext, fullViewName); if (viewEngineResult.Success) { using (var writer = new StringWriter(CultureInfo.InvariantCulture)) diff --git a/src/Microsoft.AspNet.Mvc.Core/Rendering/IViewEngine.cs b/src/Microsoft.AspNet.Mvc.Core/Rendering/IViewEngine.cs index f6be0f4019..4d81ea4613 100644 --- a/src/Microsoft.AspNet.Mvc.Core/Rendering/IViewEngine.cs +++ b/src/Microsoft.AspNet.Mvc.Core/Rendering/IViewEngine.cs @@ -1,16 +1,27 @@ // Copyright (c) Microsoft Open Technologies, Inc. All rights reserved. // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. -using System.Collections.Generic; - namespace Microsoft.AspNet.Mvc.Rendering { + /// + /// Defines the contract for a view engine. + /// public interface IViewEngine { - ViewEngineResult FindView([NotNull] IDictionary context, [NotNull] string viewName); + /// + /// Finds the specified view by using the specified action context. + /// + /// The action context. + /// The name or full path to the view. + /// A result representing the result of locating the view. + ViewEngineResult FindView(ActionContext context, string viewName); - ViewEngineResult FindPartialView( - [NotNull] IDictionary context, - [NotNull] string partialViewName); + /// + /// Finds the specified partial view by using the specified action context. + /// + /// The action context. + /// The name or full path to the view. + /// A result representing the result of locating the view. + ViewEngineResult FindPartialView(ActionContext context, string partialViewName); } } diff --git a/src/Microsoft.AspNet.Mvc.Core/ViewComponents/ViewViewComponentResult.cs b/src/Microsoft.AspNet.Mvc.Core/ViewComponents/ViewViewComponentResult.cs index 48a4ff575d..cd1a7b7883 100644 --- a/src/Microsoft.AspNet.Mvc.Core/ViewComponents/ViewViewComponentResult.cs +++ b/src/Microsoft.AspNet.Mvc.Core/ViewComponents/ViewViewComponentResult.cs @@ -61,7 +61,7 @@ namespace Microsoft.AspNet.Mvc ViewName ?? "Default"); } - var view = FindView(context.ViewContext.RouteData.Values, qualifiedViewName); + var view = FindView(context.ViewContext, qualifiedViewName); var childViewContext = new ViewContext( context.ViewContext, @@ -75,7 +75,7 @@ namespace Microsoft.AspNet.Mvc } } - private IView FindView([NotNull] IDictionary context, [NotNull] string viewName) + private IView FindView(ActionContext context, string viewName) { var result = _viewEngine.FindView(context, viewName); if (!result.Success) diff --git a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs index 033ef985ac..8d3d283274 100644 --- a/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs +++ b/src/Microsoft.AspNet.Mvc.Razor/RazorViewEngine.cs @@ -9,6 +9,9 @@ using Microsoft.AspNet.Mvc.Rendering; namespace Microsoft.AspNet.Mvc.Razor { + /// + /// Represents a view engine that is used to render a page that uses the Razor syntax. + /// public class RazorViewEngine : IViewEngine { private const string ViewExtension = ".cshtml"; @@ -27,15 +30,22 @@ namespace Microsoft.AspNet.Mvc.Razor }; private readonly IRazorPageFactory _pageFactory; - private readonly IRazorPageActivator _viewActivator; + private readonly IRazorPageActivator _pageActivator; private readonly IViewStartProvider _viewStartProvider; + /// + /// Initializes a new instance of the RazorViewEngine class. + /// + /// The page factory used for creating . + /// Activator for activated instances of . + /// The provider used to provide instances of ViewStarts applicable to the + /// page being rendered. public RazorViewEngine(IRazorPageFactory pageFactory, - IRazorPageActivator viewActivator, + IRazorPageActivator pageActivator, IViewStartProvider viewStartProvider) { _pageFactory = pageFactory; - _viewActivator = viewActivator; + _pageActivator = pageActivator; _viewStartProvider = viewStartProvider; } @@ -44,21 +54,23 @@ namespace Microsoft.AspNet.Mvc.Razor get { return _viewLocationFormats; } } - public ViewEngineResult FindView([NotNull] IDictionary context, + /// + public ViewEngineResult FindView([NotNull] ActionContext context, [NotNull] string viewName) { var viewEngineResult = CreateViewEngineResult(context, viewName, partial: false); return viewEngineResult; } - public ViewEngineResult FindPartialView([NotNull] IDictionary context, + /// + public ViewEngineResult FindPartialView([NotNull] ActionContext context, [NotNull] string partialViewName) { return CreateViewEngineResult(context, partialViewName, partial: true); } - private ViewEngineResult CreateViewEngineResult([NotNull] IDictionary context, - [NotNull] string viewName, + private ViewEngineResult CreateViewEngineResult(ActionContext context, + string viewName, bool partial) { var nameRepresentsPath = IsSpecificPath(viewName); @@ -78,8 +90,9 @@ namespace Microsoft.AspNet.Mvc.Razor } else { - var controllerName = context.GetValueOrDefault("controller"); - var areaName = context.GetValueOrDefault("area"); + var routeValues = context.RouteData.Values; + var controllerName = routeValues.GetValueOrDefault("controller"); + var areaName = routeValues.GetValueOrDefault("area"); var potentialPaths = GetViewSearchPaths(viewName, controllerName, areaName); foreach (var path in potentialPaths) @@ -98,9 +111,9 @@ namespace Microsoft.AspNet.Mvc.Razor private ViewEngineResult CreateFoundResult(IRazorPage page, string viewName, bool partial) { var view = new RazorView(_pageFactory, - _viewActivator, + _pageActivator, _viewStartProvider, - page, + page, executeViewHierarchy: !partial); return ViewEngineResult.Found(viewName, view); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Extensions/ViewEngineDscriptorExtensionsTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Extensions/ViewEngineDscriptorExtensionsTest.cs index 37f2940498..79ce0f366b 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Extensions/ViewEngineDscriptorExtensionsTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Extensions/ViewEngineDscriptorExtensionsTest.cs @@ -64,12 +64,12 @@ namespace Microsoft.AspNet.Mvc.Rendering private class TestViewEngine : IViewEngine { - public ViewEngineResult FindPartialView([NotNull]IDictionary context, [NotNull]string partialViewName) + public ViewEngineResult FindPartialView(ActionContext context, string partialViewName) { throw new NotImplementedException(); } - public ViewEngineResult FindView([NotNull]IDictionary context, [NotNull]string viewName) + public ViewEngineResult FindView(ActionContext context, string viewName) { throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/CompositeViewEngineTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/CompositeViewEngineTest.cs index 05e3570173..eeb08be2aa 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/CompositeViewEngineTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/CompositeViewEngineTest.cs @@ -3,6 +3,8 @@ using System.Collections.Generic; using System.Linq; +using Microsoft.AspNet.Http; +using Microsoft.AspNet.Routing; using Moq; using Xunit; @@ -18,16 +20,18 @@ namespace Microsoft.AspNet.Mvc.Rendering var provider = new Mock(); provider.SetupGet(p => p.ViewEngines) .Returns(new IViewEngine[0]); + var actionContext = GetActionContext(); var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindView(new Dictionary(), viewName); + var result = compositeViewEngine.FindView(actionContext, viewName); // Assert Assert.False(result.Success); Assert.Empty(result.SearchedLocations); } + [Fact] public void FindView_ReturnsNotFoundResult_WhenExactlyOneViewEngineIsRegisteredWhichReturnsNotFoundResult() { @@ -35,14 +39,14 @@ namespace Microsoft.AspNet.Mvc.Rendering var viewName = "test-view"; var provider = new Mock(); var engine = new Mock(); - engine.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "controller/test-view" })); provider.SetupGet(p => p.ViewEngines) .Returns(new[] { engine.Object }); var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindView(new Dictionary(), viewName); + var result = compositeViewEngine.FindView(GetActionContext(), viewName); // Assert Assert.False(result.Success); @@ -57,14 +61,14 @@ namespace Microsoft.AspNet.Mvc.Rendering var provider = new Mock(); var engine = new Mock(); var view = Mock.Of(); - engine.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found(viewName, view)); provider.SetupGet(p => p.ViewEngines) .Returns(new[] { engine.Object }); var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindView(new Dictionary(), viewName); + var result = compositeViewEngine.FindView(GetActionContext(), viewName); // Assert Assert.True(result.Success); @@ -81,11 +85,11 @@ namespace Microsoft.AspNet.Mvc.Rendering var engine3 = new Mock(); var view2 = Mock.Of(); var view3 = Mock.Of(); - engine1.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine1.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, Enumerable.Empty())); - engine2.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine2.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found(viewName, view2)); - engine3.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine3.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found(viewName, view3)); var provider = new Mock(); @@ -94,7 +98,7 @@ namespace Microsoft.AspNet.Mvc.Rendering var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindView(new Dictionary(), viewName); + var result = compositeViewEngine.FindView(GetActionContext(), viewName); // Assert Assert.True(result.Success); @@ -110,11 +114,11 @@ namespace Microsoft.AspNet.Mvc.Rendering var engine1 = new Mock(); var engine2 = new Mock(); var engine3 = new Mock(); - engine1.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine1.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "1", "2" })); - engine2.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine2.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "3" })); - engine3.Setup(e => e.FindView(It.IsAny>(), It.IsAny())) + engine3.Setup(e => e.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "4", "5" })); var provider = new Mock(); @@ -123,7 +127,7 @@ namespace Microsoft.AspNet.Mvc.Rendering var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindView(new Dictionary(), viewName); + var result = compositeViewEngine.FindView(GetActionContext(), viewName); // Assert Assert.False(result.Success); @@ -141,7 +145,7 @@ namespace Microsoft.AspNet.Mvc.Rendering var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindPartialView(new Dictionary(), viewName); + var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName); // Assert Assert.False(result.Success); @@ -155,14 +159,14 @@ namespace Microsoft.AspNet.Mvc.Rendering var viewName = "partial-view"; var provider = new Mock(); var engine = new Mock(); - engine.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "shared/partial-view" })); provider.SetupGet(p => p.ViewEngines) .Returns(new[] { engine.Object }); var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindPartialView(new Dictionary(), viewName); + var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName); // Assert Assert.False(result.Success); @@ -177,14 +181,14 @@ namespace Microsoft.AspNet.Mvc.Rendering var provider = new Mock(); var engine = new Mock(); var view = Mock.Of(); - engine.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found(viewName, view)); provider.SetupGet(p => p.ViewEngines) .Returns(new[] { engine.Object }); var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindPartialView(new Dictionary(), viewName); + var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName); // Assert Assert.True(result.Success); @@ -201,11 +205,11 @@ namespace Microsoft.AspNet.Mvc.Rendering var engine3 = new Mock(); var view2 = Mock.Of(); var view3 = Mock.Of(); - engine1.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine1.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, Enumerable.Empty())); - engine2.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine2.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found(viewName, view2)); - engine3.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine3.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found(viewName, view3)); var provider = new Mock(); @@ -214,7 +218,7 @@ namespace Microsoft.AspNet.Mvc.Rendering var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindPartialView(new Dictionary(), viewName); + var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName); // Assert Assert.True(result.Success); @@ -230,11 +234,11 @@ namespace Microsoft.AspNet.Mvc.Rendering var engine1 = new Mock(); var engine2 = new Mock(); var engine3 = new Mock(); - engine1.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine1.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "1", "2" })); - engine2.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine2.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "3" })); - engine3.Setup(e => e.FindPartialView(It.IsAny>(), It.IsAny())) + engine3.Setup(e => e.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound(viewName, new[] { "4", "5" })); var provider = new Mock(); @@ -243,11 +247,17 @@ namespace Microsoft.AspNet.Mvc.Rendering var compositeViewEngine = new CompositeViewEngine(provider.Object); // Act - var result = compositeViewEngine.FindPartialView(new Dictionary(), viewName); + var result = compositeViewEngine.FindPartialView(GetActionContext(), viewName); // Assert Assert.False(result.Success); Assert.Equal(new[] { "1", "2", "3", "4", "5" }, result.SearchedLocations); } + + private static ActionContext GetActionContext() + { + var httpContext = Mock.Of(); + return new ActionContext(httpContext, new RouteData(), new ActionDescriptor()); + } } } \ No newline at end of file diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultDisplayTemplatesTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultDisplayTemplatesTests.cs index acbfdbad0d..f9ab3f19d8 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultDisplayTemplatesTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultDisplayTemplatesTests.cs @@ -86,7 +86,7 @@ namespace Microsoft.AspNet.Mvc.Core "; var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn(); var viewEngine = new Mock(); - viewEngine.Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + viewEngine.Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); @@ -104,7 +104,7 @@ namespace Microsoft.AspNet.Mvc.Core var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); helper.ViewData["Property1"] = "ViewData string"; @@ -123,7 +123,7 @@ namespace Microsoft.AspNet.Mvc.Core var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); helper.ViewData["Property1"] = "ViewData string"; @@ -142,7 +142,7 @@ namespace Microsoft.AspNet.Mvc.Core var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); @@ -162,7 +162,7 @@ namespace Microsoft.AspNet.Mvc.Core var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); helper.ViewData["Property1"] = "ViewData string"; diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs index e97a9abf47..15ecc0060b 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultEditorTemplatesTests.cs @@ -94,7 +94,7 @@ Environment.NewLine; var model = new DefaultTemplatesUtilities.ObjectWithScaffoldColumn(); var viewEngine = new Mock(); - viewEngine.Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + viewEngine.Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var htmlHelper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); @@ -112,7 +112,7 @@ Environment.NewLine; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); helper.ViewData["Property1"] = "ViewData string"; @@ -133,7 +133,7 @@ Environment.NewLine; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); helper.ViewData["Property1"] = "ViewData string"; @@ -154,7 +154,7 @@ Environment.NewLine; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = "Model string" }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); @@ -176,7 +176,7 @@ Environment.NewLine; var model = new DefaultTemplatesUtilities.ObjectTemplateModel { Property1 = propertyValue, }; var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.NotFound("", Enumerable.Empty())); var helper = DefaultTemplatesUtilities.GetHtmlHelper(model, viewEngine.Object); helper.ViewData["Property1"] = "ViewData string"; diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultTemplatesUtilities.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultTemplatesUtilities.cs index a7cc20a903..187be78337 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultTemplatesUtilities.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultTemplatesUtilities.cs @@ -151,7 +151,7 @@ namespace Microsoft.AspNet.Mvc.Core var viewEngine = new Mock(); viewEngine - .Setup(v => v.FindPartialView(It.IsAny>(), It.IsAny())) + .Setup(v => v.FindPartialView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found("MyView", view.Object)); return viewEngine.Object; diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultViewEngineProviderTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultViewEngineProviderTest.cs index 7b1970c4d7..0c53deb6ec 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultViewEngineProviderTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/DefaultViewEngineProviderTest.cs @@ -51,12 +51,12 @@ namespace Microsoft.AspNet.Mvc.Rendering public ITestService Service { get; private set; } - public ViewEngineResult FindPartialView([NotNull]IDictionary context, [NotNull]string partialViewName) + public ViewEngineResult FindPartialView(ActionContext context, string partialViewName) { throw new NotImplementedException(); } - public ViewEngineResult FindView([NotNull]IDictionary context, [NotNull]string viewName) + public ViewEngineResult FindView(ActionContext context, string viewName) { throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/ViewEngineDescriptorTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/ViewEngineDescriptorTest.cs index 2b6a0e48dc..5af7f9afb2 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/ViewEngineDescriptorTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/Rendering/ViewEngineDescriptorTest.cs @@ -53,12 +53,12 @@ namespace Microsoft.AspNet.Mvc.Rendering private class TestViewEngine : IViewEngine { - public ViewEngineResult FindPartialView(IDictionary context, string partialViewName) + public ViewEngineResult FindPartialView(ActionContext context, string partialViewName) { throw new NotImplementedException(); } - public ViewEngineResult FindView(IDictionary context, string viewName) + public ViewEngineResult FindView(ActionContext context, string viewName) { throw new NotImplementedException(); } diff --git a/test/Microsoft.AspNet.Mvc.Core.Test/ViewResultTest.cs b/test/Microsoft.AspNet.Mvc.Core.Test/ViewResultTest.cs index 4032b498b3..1d08d8a588 100644 --- a/test/Microsoft.AspNet.Mvc.Core.Test/ViewResultTest.cs +++ b/test/Microsoft.AspNet.Mvc.Core.Test/ViewResultTest.cs @@ -35,8 +35,6 @@ namespace Microsoft.AspNet.Mvc.Core.Test var routeDictionary = new Dictionary(); var viewEngine = new Mock(); - viewEngine.Setup(v => v.FindView(routeDictionary, It.IsAny())) - .Returns(ViewEngineResult.Found("MyView", view.Object)); var serviceProvider = new Mock(); serviceProvider.Setup(sp => sp.GetService(typeof(ICompositeViewEngine))) @@ -52,12 +50,15 @@ namespace Microsoft.AspNet.Mvc.Core.Test .Returns(response.Object); context.SetupGet(c => c.RequestServices) .Returns(serviceProvider.Object); - + var actionContext = new ActionContext(context.Object, - new RouteData() { Values = routeDictionary }, + new RouteData() { Values = routeDictionary }, new ActionDescriptor()); - - + + viewEngine.Setup(v => v.FindView(actionContext, It.IsAny())) + .Returns(ViewEngineResult.Found("MyView", view.Object)); + + var viewResult = new ViewResult(); // Act @@ -84,8 +85,6 @@ namespace Microsoft.AspNet.Mvc.Core.Test var routeDictionary = new Dictionary(); var goodViewEngine = new Mock(); - goodViewEngine.Setup(v => v.FindView(routeDictionary, It.IsAny())) - .Returns(ViewEngineResult.Found("MyView", view.Object)); var badViewEngine = new Mock(MockBehavior.Strict); @@ -108,6 +107,10 @@ namespace Microsoft.AspNet.Mvc.Core.Test new RouteData() { Values = routeDictionary }, new ActionDescriptor()); + goodViewEngine.Setup(v => v.FindView(actionContext, It.IsAny())) + .Returns(ViewEngineResult.Found("MyView", view.Object)); + + var viewResult = new ViewResult() { ViewEngine = goodViewEngine.Object, @@ -141,7 +144,7 @@ namespace Microsoft.AspNet.Mvc.Core.Test }); var viewEngine = new Mock(); - viewEngine.Setup(v => v.FindView(routeDictionary, It.IsAny())) + viewEngine.Setup(v => v.FindView(It.IsAny(), It.IsAny())) .Returns(ViewEngineResult.Found("MyView", view.Object)); var serviceProvider = new Mock(); @@ -156,11 +159,11 @@ namespace Microsoft.AspNet.Mvc.Core.Test context.SetupGet(c => c.Response) .Returns(response.Object); context.SetupGet(c => c.RequestServices).Returns(serviceProvider.Object); - + var actionContext = new ActionContext(context.Object, new RouteData() { Values = routeDictionary }, new ActionDescriptor()); - + var viewResult = new ViewResult(); // Act diff --git a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs index f8c6567354..65f9b13d79 100644 --- a/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs +++ b/test/Microsoft.AspNet.Mvc.Razor.Test/RazorViewEngineTest.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; +using Microsoft.AspNet.Http; using Microsoft.AspNet.Mvc.Rendering; +using Microsoft.AspNet.Routing; using Moq; using Xunit; @@ -39,10 +41,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var viewEngine = CreateSearchLocationViewEngineTester(); + var context = GetActionContext(_controllerTestContext); // Act & Assert Assert.Throws(() => - viewEngine.FindView(_controllerTestContext, viewName)); + viewEngine.FindView(context, viewName)); } [Theory] @@ -53,10 +56,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test var viewEngine = CreateSearchLocationViewEngineTester(); // Append .cshtml so the viewname is no longer invalid viewName += ".cshtml"; + var context = GetActionContext(_controllerTestContext); // Act & Assert // If this throws then our test case fails - var result = viewEngine.FindPartialView(_controllerTestContext, viewName); + var result = viewEngine.FindPartialView(context, viewName); Assert.False(result.Success); } @@ -67,10 +71,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var viewEngine = CreateSearchLocationViewEngineTester(); + var context = GetActionContext(_controllerTestContext); // Act & Assert Assert.Throws(() => - viewEngine.FindPartialView(_controllerTestContext, partialViewName)); + viewEngine.FindPartialView(context, partialViewName)); } [Theory] @@ -81,10 +86,11 @@ namespace Microsoft.AspNet.Mvc.Razor.Test var viewEngine = CreateSearchLocationViewEngineTester(); // Append .cshtml so the viewname is no longer invalid partialViewName += ".cshtml"; + var context = GetActionContext(_controllerTestContext); // Act & Assert // If this throws then our test case fails - var result = viewEngine.FindPartialView(_controllerTestContext, partialViewName); + var result = viewEngine.FindPartialView(context, partialViewName); Assert.False(result.Success); } @@ -95,15 +101,16 @@ namespace Microsoft.AspNet.Mvc.Razor.Test // Arrange var searchedLocations = new List(); var viewEngine = CreateSearchLocationViewEngineTester(); + var context = GetActionContext(_areaTestContext); // Act - var result = viewEngine.FindPartialView(_areaTestContext, "partial"); + var result = viewEngine.FindPartialView(context, "partial"); // Assert Assert.False(result.Success); - Assert.Equal(new[] { - "/Areas/foo/Views/bar/partial.cshtml", - "/Areas/foo/Views/Shared/partial.cshtml", + Assert.Equal(new[] { + "/Areas/foo/Views/bar/partial.cshtml", + "/Areas/foo/Views/Shared/partial.cshtml", "/Views/Shared/partial.cshtml", }, result.SearchedLocations); } @@ -113,14 +120,15 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var viewEngine = CreateSearchLocationViewEngineTester(); + var context = GetActionContext(_controllerTestContext); // Act - var result = viewEngine.FindPartialView(_controllerTestContext, "partialNoArea"); + var result = viewEngine.FindPartialView(context, "partialNoArea"); // Assert Assert.False(result.Success); - Assert.Equal(new[] { - "/Views/bar/partialNoArea.cshtml", + Assert.Equal(new[] { + "/Views/bar/partialNoArea.cshtml", "/Views/Shared/partialNoArea.cshtml", }, result.SearchedLocations); } @@ -130,15 +138,16 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var viewEngine = CreateSearchLocationViewEngineTester(); + var context = GetActionContext(_areaTestContext); // Act - var result = viewEngine.FindView(_areaTestContext, "full"); + var result = viewEngine.FindView(context, "full"); // Assert Assert.False(result.Success); - Assert.Equal(new[] { - "/Areas/foo/Views/bar/full.cshtml", - "/Areas/foo/Views/Shared/full.cshtml", + Assert.Equal(new[] { + "/Areas/foo/Views/bar/full.cshtml", + "/Areas/foo/Views/Shared/full.cshtml", "/Views/Shared/full.cshtml", }, result.SearchedLocations); } @@ -148,14 +157,15 @@ namespace Microsoft.AspNet.Mvc.Razor.Test { // Arrange var viewEngine = CreateSearchLocationViewEngineTester(); + var context = GetActionContext(_controllerTestContext); // Act - var result = viewEngine.FindView(_controllerTestContext, "fullNoArea"); + var result = viewEngine.FindView(context, "fullNoArea"); // Assert Assert.False(result.Success); - Assert.Equal(new[] { - "/Views/bar/fullNoArea.cshtml", + Assert.Equal(new[] { + "/Views/bar/fullNoArea.cshtml", "/Views/Shared/fullNoArea.cshtml", }, result.SearchedLocations); } @@ -170,9 +180,10 @@ namespace Microsoft.AspNet.Mvc.Razor.Test var viewEngine = new RazorViewEngine(pageFactory.Object, Mock.Of(), Mock.Of()); + var context = GetActionContext(_controllerTestContext); // Act - var result = viewEngine.FindView(_controllerTestContext, "test-view"); + var result = viewEngine.FindView(context, "test-view"); // Assert Assert.True(result.Success); @@ -192,5 +203,12 @@ namespace Microsoft.AspNet.Mvc.Razor.Test return viewEngine; } + + private static ActionContext GetActionContext(IDictionary routeValues) + { + var httpContext = Mock.Of(); + var routeData = new RouteData { Values = routeValues }; + return new ActionContext(httpContext, routeData, new ActionDescriptor()); + } } -} \ No newline at end of file +} diff --git a/test/WebSites/CompositeViewEngine/TestViewEngine.cs b/test/WebSites/CompositeViewEngine/TestViewEngine.cs index ce7a88ddae..7b59d40b0a 100644 --- a/test/WebSites/CompositeViewEngine/TestViewEngine.cs +++ b/test/WebSites/CompositeViewEngine/TestViewEngine.cs @@ -2,14 +2,14 @@ // Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. using System; -using System.Collections.Generic; +using Microsoft.AspNet.Mvc; using Microsoft.AspNet.Mvc.Rendering; namespace CompositeViewEngine { public class TestViewEngine : IViewEngine { - public ViewEngineResult FindPartialView(IDictionary context, string partialViewName) + public ViewEngineResult FindPartialView(ActionContext context, string partialViewName) { if (string.Equals(partialViewName, "partial-test-view", StringComparison.Ordinal)) { @@ -18,7 +18,7 @@ namespace CompositeViewEngine return ViewEngineResult.NotFound(partialViewName, new[] { partialViewName }); } - public ViewEngineResult FindView(IDictionary context, string viewName) + public ViewEngineResult FindView(ActionContext context, string viewName) { if (string.Equals(viewName, "test-view")) {