2

私は、実行時に基本実装を呼び出し、応答の を に設定する、という非常に単純なViewResultサブクラスを作成しています。このクラスの単体テストを試みているときに、ASP.NET MVC スタックのすべての依存関係を満たすために、多くの困難に直面しています。JavaScriptViewResultContent-Typetext/javascript

これまでのところ、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);
}

テスト実行時の最新の例外は、 のNullReferenceException奥深くにありSystem.Web.Routing.Route.GetRouteData(HttpContextBase httpContext)ます。

を実行するためのすべての依存関係を設定するにはどうすればよいViewResultですか? これを簡単にするためのテクニックはありますか?Content-Typeまたは、MVC ビュー エンジンを利用して、応答に適切な値を設定する JavaScript を生成する別の方法はありますか?

4

1 に答える 1

3

の最小要件を満たす方法を見つけましたViewResult。私が遭遇した問題の1つは、ビューを見つけるプロセスをあざけることでした。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);
}
于 2011-12-28T23:44:24.973 に答える