Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

148 lines
5.7 KiB
C#

// 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;
}
}
}
}