1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147
|
// 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<TextWriter>().Object),
"viewContext"
);
}
[Fact]
public void RenderWithNullViewInstanceThrows()
{
// Arrange
ViewContext context = new Mock<ViewContext>().Object;
MockBuildManager buildManager = new MockBuildManager("view path", compiledType: null);
TestableBuildManagerCompiledView view = new TestableBuildManagerCompiledView(new ControllerContext(), "view path");
view.BuildManager = buildManager;
// Act & Assert
Assert.Throws<InvalidOperationException>(
() => view.Render(context, new Mock<TextWriter>().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<IViewPageActivator> activator = new Mock<IViewPageActivator>(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<ViewContext>().Object, new Mock<TextWriter>().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<IDependencyResolver>(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<ViewContext>().Object, new Mock<TextWriter>().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<IDependencyResolver>();
var view = new TestableBuildManagerCompiledView(controllerContext, "view path", dependencyResolver: dependencyResolver.Object) { BuildManager = buildManager };
// Act
MissingMethodException ex = Assert.Throws<MissingMethodException>( // Depend on the fact that Activator.CreateInstance cannot create an object without a parameterless ctor
() => view.Render(new Mock<ViewContext>().Object, new Mock<TextWriter>().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;
}
}
}
}
|