2009-12-11 13 views
9

コントローラのアクションの中には、AJAXリクエストによって呼び出されたかどうかに応じて異なるViewResultsで応答する必要があります。現在、私はこれを確認するためにIsAjaxRequest()メソッドを使用しています。このメソッドがユニットテスト中に呼び出されると、HTTPコンテキストが存在しないためにArgumentNullExceptionがスローされます。ユニットテストコントローラIsAjaxRequest()を呼び出すアクション

この呼び出しを模擬する方法はありますか?それとも、これはAJAXリクエストを別の方法で調べるべきであるという印ですか?

+0

SO-どのようにASP.NET MVCでAJAX submitionをテストするには? - http://stackoverflow.com/questions/1010900/how-to-test-an-ajax-submition-in-asp-net-mvc –

答えて

12

HTTPコンテキストにTest Doubleを指定すると役に立ちますか?

これは次のように行うことができます。sutは、テスト対象システム(SUT)、テストしたい、すなわちコントローラを表し

var httpCtxStub = new Mock<HttpContextBase>(); 

var controllerCtx = new ControllerContext(); 
controllerCtx.HttpContext = httpCtxStub.Object; 

sut.ControllerContext = controllerCtx; 

この例では、Moqを使用しています。

3

MVCのテストプロジェクトでmoqライブラリを使用して

[TestClass] 
public class HomeControllerTest 
{ 
    [TestMethod] 
    public void Index() 
    { 
     // Arrange 
     HomeController controller = new HomeController(); 
     controller.injectContext(); 
     // controller.injectContext(ajaxRequest: true); 

     // Act 
     ViewResult result = controller.Index() as ViewResult; 

     // Assert 
     Assert.IsNotNull(result); 
    } 
} 


public static class MvcTestExtensions 
{ 
    public static void injectContext(this ControllerBase controller, bool ajaxRequest = false) 
    { 
     var fakeContext = new Mock<ControllerContext>(); 
     fakeContext.Setup(r => r.HttpContext.Request["X-Requested-With"]) 
      .Returns(ajaxRequest ? "XMLHttpRequest" : ""); 
     controller.ControllerContext = fakeContext.Object; 
    } 
} 
関連する問題