【问题标题】:Unit test dependencies for an ASP.NET MVC 3 ViewResult subclassASP.NET MVC 3 ViewResult 子类的单元测试依赖项
【发布时间】:2011-12-28 21:32:12
【问题描述】:

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

这是我使用 Rhino 的单元测试到目前为止的样子:

[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);
}

运行测试时的最新异常是NullReferenceExceptionSystem.Web.Routing.Route.GetRouteData(HttpContextBase httpContext) 的内部深处。

如何设置执行ViewResult 的所有依赖项?有什么技术可以让这更简单吗?或者,我可以利用 MVC 视图引擎生成 JavaScript 来为响应设置正确的 Content-Type 吗?

【问题讨论】:

    标签: c# asp.net-mvc-3 unit-testing rhino-mocks viewresult


    【解决方案1】:

    我想出了如何满足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);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多