c# - ASP.NET MVC 3 ViewResult 子类的单元测试依赖项

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

我正在创建一个名为 JavaScriptViewResult 的非常简单的 ViewResult 子类,它在执行时调用基本实现,然后设置 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);
}

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

如何设置执行 ViewResult 的所有依赖项?有什么技术可以让这个变得更简单吗?或者,是否有其他方法可以利用 MVC View 引擎生成 JavaScript,为响应设置正确的 Content-Type

最佳答案

我弄清楚了如何满足 ViewResult 的最低要求。我遇到的一个问题是 mock 寻找 View 的过程。通过确保填充对象的 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);
}

关于c# - ASP.NET MVC 3 ViewResult 子类的单元测试依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8661556/

相关文章:

C# 在控制台和服务之间共享 DLL

asp.net-mvc-3 - 如何将复选框绑定(bind)到 mvc3 中的 View 模型

asp.net-mvc-3 - Ninject 和 MVC3 Controller 和操作上的依赖注入(inject)操作过滤器存在问题

c# - 如何在 C# 中创建用于测试目的的模拟任务对象?

c# - 在 C# 中使用静态函数和变量的困难

c# - 如何将一个 mvc3 c# 项目添加到其他可执行项目中?

entity-framework - Entity Framework 验证困惑- '128'的最大字符串长度

javascript - 单元测试异步 Angular 指令

java - 我可以并且应该在 GWT 中测试 fireEvent 和 Handlers 方法吗?

c# - 将多个连续的相等字符从一个字符串减少为一个