// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information. using System.IO; using Moq; using Xunit; using Assert = Microsoft.TestCommon.AssertEx; namespace System.Web.Mvc.Test { public class CompiledTypeViewTest { [Fact] public void GuardClauses() { // Act & Assert Assert.ThrowsArgumentNullOrEmpty( () => new TestableBuildManagerCompiledView(new ControllerContext(), String.Empty), "viewPath" ); // Act & Assert Assert.ThrowsArgumentNullOrEmpty( () => new TestableBuildManagerCompiledView(new ControllerContext(), null), "viewPath" ); // Act & Assert Assert.ThrowsArgumentNull( () => new TestableBuildManagerCompiledView(null, "view path"), "controllerContext" ); } [Fact] public void RenderWithNullContextThrows() { // Arrange TestableBuildManagerCompiledView view = new TestableBuildManagerCompiledView(new ControllerContext(), "~/view"); // Act & Assert Assert.ThrowsArgumentNull( () => view.Render(null, new Mock().Object), "viewContext" ); } [Fact] public void RenderWithNullViewInstanceThrows() { // Arrange ViewContext context = new Mock().Object; MockBuildManager buildManager = new MockBuildManager("view path", compiledType: null); TestableBuildManagerCompiledView view = new TestableBuildManagerCompiledView(new ControllerContext(), "view path"); view.BuildManager = buildManager; // Act & Assert Assert.Throws( () => view.Render(context, new Mock().Object), "The view found at 'view path' was not created." ); } [Fact] public void ViewPathProperty() { // Act BuildManagerCompiledView view = new TestableBuildManagerCompiledView(new ControllerContext(), "view path"); // Assert Assert.Equal("view path", view.ViewPath); } [Fact] public void ViewCreationConsultsSetActivator() { // Arrange object viewInstance = new object(); Mock activator = new Mock(MockBehavior.Strict); ControllerContext controllerContext = new ControllerContext(); activator.Setup(a => a.Create(controllerContext, typeof(object))).Returns(viewInstance).Verifiable(); MockBuildManager buildManager = new MockBuildManager("view path", typeof(object)); BuildManagerCompiledView view = new TestableBuildManagerCompiledView(controllerContext, "view path", activator.Object) { BuildManager = buildManager }; // Act view.Render(new Mock().Object, new Mock().Object); // Assert activator.Verify(); } [Fact] public void ViewCreationDelegatesToDependencyResolverWhenActivatorIsNull() { // Arrange var viewInstance = new object(); var controllerContext = new ControllerContext(); var buildManager = new MockBuildManager("view path", typeof(object)); var dependencyResolver = new Mock(MockBehavior.Strict); dependencyResolver.Setup(dr => dr.GetService(typeof(object))).Returns(viewInstance).Verifiable(); var view = new TestableBuildManagerCompiledView(controllerContext, "view path", dependencyResolver: dependencyResolver.Object) { BuildManager = buildManager }; // Act view.Render(new Mock().Object, new Mock().Object); // Assert dependencyResolver.Verify(); } [Fact] public void ViewCreationDelegatesToActivatorCreateInstanceWhenDependencyResolverReturnsNull() { // Arrange var controllerContext = new ControllerContext(); var buildManager = new MockBuildManager("view path", typeof(NoParameterlessCtor)); var dependencyResolver = new Mock(); var view = new TestableBuildManagerCompiledView(controllerContext, "view path", dependencyResolver: dependencyResolver.Object) { BuildManager = buildManager }; // Act MissingMethodException ex = Assert.Throws( // Depend on the fact that Activator.CreateInstance cannot create an object without a parameterless ctor () => view.Render(new Mock().Object, new Mock().Object) ); // Assert Assert.Contains("System.Activator.CreateInstance(", ex.StackTrace); } private class NoParameterlessCtor { public NoParameterlessCtor(int x) { } } private sealed class TestableBuildManagerCompiledView : BuildManagerCompiledView { public TestableBuildManagerCompiledView(ControllerContext controllerContext, string viewPath, IViewPageActivator viewPageActivator = null, IDependencyResolver dependencyResolver = null) : base(controllerContext, viewPath, viewPageActivator, dependencyResolver) { } protected override void RenderView(ViewContext viewContext, TextWriter writer, object instance) { return; } } } }