2011-12-28 74 views
3

我创建了一个非常简单的ViewResult子类,称为JavaScriptViewResult,它在执行时调用基本实现,然后将响应的Content-Type设置为text/javascript。在试图对这个类进行单元测试时,我遇到了许多实现ASP.NET MVC堆栈的所有依赖关系的困难。ASP.NET MVC 3 ViewResult子类的单元测试依赖关系

这里是我的单元测试,使用犀牛,看起来像至今:

[TestMethod] 
public void TestExecuteAction() 
{ 
    var request = MockRepository.GenerateMock<HttpRequestBase>(); 
    request.Expect(m => m.Url).Return(new Uri("/Test/JavaScript", UriKind.Relative)); 

    var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
    httpContext.Expect(m => m.Request).Return(request); 

    var controller = MockRepository.GenerateMock<ControllerBase>(); 

    var virtualPathProvider = MockRepository.GenerateMock<VirtualPathProvider>(); 

    var routeCollection = new RouteCollection(virtualPathProvider); 
    routeCollection.MapRoute("FakeRoute", "Test/JavaScript", new { controller = "Test", action = "JavaScript" }); 
    var routeData = routeCollection.GetRouteData(httpContext); 

    var context = new ControllerContext(httpContext, routeData, controller); 

    var viewResult = new JavaScriptViewResult(); 
    viewResult.ExecuteResult(context); 

    Assert.AreEqual("text/javascript", context.HttpContext.Response.ContentType); 
} 

运行测试时,最新的例外是System.Web.Routing.Route.GetRouteData(HttpContextBase httpContext)肠子里的一个NullReferenceException

如何设置执行ViewResult的所有依赖关系?有没有什么技术可以使这个更简单?或者,我可以通过不同的方式利用MVC视图引擎生成JavaScript,以便为响应设置适当的Content-Type

回答

4

我想出了如何满足ViewResult的最低要求。我遇到的一个问题是嘲笑寻找视图的过程。这可以通过确保我的对象的View属性被填充来避免。这里是我的工作测试:

[TestMethod] 
public void TestExecuteAction() 
{ 
    var response = MockRepository.GenerateStub<HttpResponseBase>(); 
    response.Output = new StringWriter(); 

    var httpContext = MockRepository.GenerateMock<HttpContextBase>(); 
    httpContext.Expect(m => m.Response).Return(response); 

    var routeData = new RouteData(); 
    routeData.Values.Add("action", "FakeAction"); 

    var context = new ControllerContext(httpContext, routeData, MockRepository.GenerateMock<ControllerBase>()); 

    var viewResult = new JavaScriptViewResult(); 
    viewResult.View = MockRepository.GenerateMock<IView>(); 
    viewResult.ExecuteResult(context); 

    Assert.AreEqual("text/javascript", context.HttpContext.Response.ContentType); 
} 
+0

+1嘲笑IView。这是我错过的唯一步骤。 – 2012-07-08 12:42:38