// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.Collections.Generic; using System.IO; using System.Web.Routing; using System.Web.TestUtil; using Moq; using Xunit; using Assert = Microsoft.TestCommon.AssertEx; namespace System.Web.Mvc.Test { public class ViewResultTest { private const string _viewName = "My cool view."; private const string _masterName = "My cool master."; [Fact] public void EmptyViewNameUsesActionNameAsViewName() { // Arrange ControllerBase controller = new Mock().Object; HttpContextBase httpContext = CreateHttpContext(); RouteData routeData = new RouteData(); routeData.Values["action"] = _viewName; ControllerContext context = new ControllerContext(httpContext, routeData, controller); Mock viewEngine = new Mock(MockBehavior.Strict); Mock view = new Mock(MockBehavior.Strict); List viewEngines = new List(); viewEngines.Add(viewEngine.Object); Mock viewEngineCollection = new Mock(MockBehavior.Strict, viewEngines); ViewResult result = new ViewResultHelper { ViewEngineCollection = viewEngineCollection.Object }; viewEngineCollection .Setup(e => e.FindView(It.IsAny(), _viewName, _masterName)) .Returns(new ViewEngineResult(view.Object, viewEngine.Object)); viewEngine .Setup(e => e.FindView(It.IsAny(), _viewName, _masterName, It.IsAny())) .Callback( (controllerContext, viewName, masterName, useCache) => { Assert.Same(httpContext, controllerContext.HttpContext); Assert.Same(routeData, controllerContext.RouteData); }) .Returns(new ViewEngineResult(view.Object, viewEngine.Object)); view .Setup(o => o.Render(It.IsAny(), httpContext.Response.Output)) .Callback( (viewContext, writer) => { Assert.Same(view.Object, viewContext.View); Assert.Same(result.ViewData, viewContext.ViewData); Assert.Same(result.TempData, viewContext.TempData); Assert.Same(controller, viewContext.Controller); }); viewEngine .Setup(e => e.ReleaseView(context, It.IsAny())) .Callback( (controllerContext, releasedView) => { Assert.Same(releasedView, view.Object); }); // Act result.ExecuteResult(context); // Assert viewEngine.Verify(); viewEngineCollection.Verify(); view.Verify(); } [Fact] public void EngineLookupFailureThrows() { // Arrange ControllerBase controller = new Mock().Object; HttpContextBase httpContext = CreateHttpContext(); RouteData routeData = new RouteData(); routeData.Values["action"] = _viewName; ControllerContext context = new ControllerContext(httpContext, routeData, controller); Mock viewEngine = new Mock(MockBehavior.Strict); List viewEngines = new List(); viewEngines.Add(viewEngine.Object); Mock viewEngineCollection = new Mock(MockBehavior.Strict, viewEngines); ViewResult result = new ViewResultHelper { ViewEngineCollection = viewEngineCollection.Object }; viewEngineCollection .Setup(e => e.FindView(It.IsAny(), _viewName, _masterName)) .Returns(new ViewEngineResult(new[] { "location1", "location2" })); viewEngine .Setup(e => e.FindView(It.IsAny(), _viewName, _masterName, It.IsAny())) .Callback( (controllerContext, viewName, masterName, useCache) => { Assert.Same(httpContext, controllerContext.HttpContext); Assert.Same(routeData, controllerContext.RouteData); }) .Returns(new ViewEngineResult(new[] { "location1", "location2" })); // Act & Assert Assert.Throws( () => result.ExecuteResult(context), @"The view '" + _viewName + @"' or its master was not found or no view engine supports the searched locations. The following locations were searched: location1 location2"); viewEngine.Verify(); viewEngineCollection.Verify(); } [Fact] public void EngineLookupSuccessRendersView() { // Arrange ControllerBase controller = new Mock().Object; HttpContextBase httpContext = CreateHttpContext(); RouteData routeData = new RouteData(); ControllerContext context = new ControllerContext(httpContext, routeData, controller); Mock viewEngine = new Mock(MockBehavior.Strict); Mock view = new Mock(MockBehavior.Strict); List viewEngines = new List(); viewEngines.Add(viewEngine.Object); Mock viewEngineCollection = new Mock(MockBehavior.Strict, viewEngines); ViewResult result = new ViewResultHelper { ViewName = _viewName, ViewEngineCollection = viewEngineCollection.Object }; view .Setup(o => o.Render(It.IsAny(), httpContext.Response.Output)) .Callback( (viewContext, writer) => { Assert.Same(view.Object, viewContext.View); Assert.Same(result.ViewData, viewContext.ViewData); Assert.Same(result.TempData, viewContext.TempData); Assert.Same(controller, viewContext.Controller); }); viewEngineCollection .Setup(e => e.FindView(It.IsAny(), _viewName, _masterName)) .Returns(new ViewEngineResult(view.Object, viewEngine.Object)); viewEngine .Setup(e => e.FindView(It.IsAny(), _viewName, _masterName, It.IsAny())) .Callback( (controllerContext, viewName, masterName, useCache) => { Assert.Same(httpContext, controllerContext.HttpContext); Assert.Same(routeData, controllerContext.RouteData); }) .Returns(new ViewEngineResult(view.Object, viewEngine.Object)); viewEngine .Setup(e => e.ReleaseView(context, It.IsAny())) .Callback( (controllerContext, releasedView) => { Assert.Same(releasedView, view.Object); }); // Act result.ExecuteResult(context); // Assert viewEngine.Verify(); viewEngineCollection.Verify(); view.Verify(); } [Fact] public void ExecuteResultWithExplicitViewObject() { // Arrange ControllerBase controller = new Mock().Object; HttpContextBase httpContext = CreateHttpContext(); RouteData routeData = new RouteData(); routeData.Values["action"] = _viewName; ControllerContext context = new ControllerContext(httpContext, routeData, controller); Mock view = new Mock(MockBehavior.Strict); ViewResult result = new ViewResultHelper { View = view.Object }; view .Setup(o => o.Render(It.IsAny(), httpContext.Response.Output)) .Callback( (viewContext, writer) => { Assert.Same(view.Object, viewContext.View); Assert.Same(result.ViewData, viewContext.ViewData); Assert.Same(result.TempData, viewContext.TempData); Assert.Same(controller, viewContext.Controller); }); // Act result.ExecuteResult(context); // Assert view.Verify(); } [Fact] public void ExecuteResultWithNullControllerContextThrows() { // Arrange ViewResult result = new ViewResultHelper(); // Act & Assert Assert.ThrowsArgumentNull( () => result.ExecuteResult(null), "context"); } [Fact] public void MasterNameProperty() { // Arrange ViewResult result = new ViewResult(); // Act & Assert MemberHelper.TestStringProperty(result, "MasterName", String.Empty); } private static HttpContextBase CreateHttpContext() { Mock mockHttpContext = new Mock(); mockHttpContext.Setup(c => c.Response.Output).Returns(TextWriter.Null); return mockHttpContext.Object; } private class ViewResultHelper : ViewResult { public ViewResultHelper() { ViewEngineCollection = new ViewEngineCollection(new IViewEngine[] { new WebFormViewEngine() }); MasterName = _masterName; } } } }