Question...
What is the best Unit Test way to answer string and content type from multiple controller methods?
Using...
Each method returns ActionResult, some of which are answers ViewResult. I am using ASP.NET MVC 2 RTM and Moq .
In particular...
I want to get TextWriterfrom HttpContext.Responseand contain the full answer of a string from ActionResult.
Why?
1. As part of unit tests
I want to check some specific if the content and does not exist with the exit.
2. Runtime via workflow
, . HTTP , .
, Runtime, Unit Tests, ?
1
, , RegisterRoutes RegisterAllAreas, , BuildManagerWrapper::IBuildManager.GetReferencedAssemblies.
:
public static HttpContextBase FakeHttpContext()
{
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
var response = new Mock<HttpResponseBase>();
var session = new Mock<HttpSessionStateBase>();
var server = new Mock<HttpServerUtilityBase>();
var writer = new StringWriter();
var form = new NameValueCollection();
var queryString = new NameValueCollection();
request.Setup(r => r.Form).Returns(form);
request.Setup(r => r.QueryString).Returns(queryString);
context.Setup(ctx => ctx.Request).Returns(request.Object);
context.Setup(ctx => ctx.Response).Returns(response.Object);
context.Setup(ctx => ctx.Session).Returns(session.Object);
context.Setup(ctx => ctx.Server).Returns(server.Object);
context.Setup(ctx => ctx.Response.Output).Returns(writer);
return context.Object;
}
public static void SetFakeControllerContext(this Controller controller)
{
var httpContext = FakeHttpContext();
var routeData = new RouteData();
var routeData = RouteTable.Routes.GetRouteData(httpContext);
ControllerContext context = new ControllerContext(new RequestContext(httpContext, routeData), controller);
controller.ControllerContext = context;
}
TestMethod :
[TestMethod]
public void CodedJavaScriptAction_Should_Return_JavaScript_Response()
{
var controller = new CodedController();
controller.SetFakeControllerContext();
var result = controller.CodedJavaScript();
var controllerContext = controller.ControllerContext;
var routeData = controllerContext.RouteData;
routeData.DataTokens.Add("area", "Coded");
routeData.Values.Add("area", "Coded");
routeData.Values.Add("controller", "Coded");
routeData.Values.Add("action", "CodedJavaScript");
var response = controllerContext.HttpContext.Response;
response.Buffer = true;
var vr = result as ViewResult;
vr.MasterName = "CodedJavaScript";
result.ExecuteResult(controllerContext);
var s = response.Output.ToString();
Assert.AreEqual("text/javascript", response.ContentType);
Assert.IsTrue(s.Length > 0);
}
, :
- Areas\Coded\Controllers\CodeController.cs
- Areas\Coded\Views\Coded\CodedJavaScript.aspx
- Areas\Coded\CodedAreaRegistration.cs
- Views\Shared\CodedJavaScript.Master
: , Runtime. @Darin Dimitrov Integration Testing, .
EDIT. MvcIntegrationTestFramework alexn. AppDomain.CreateDomain SimpleWorkerRequest , , , - static. , .
, , , Partial View ?