2016-09-14 5 views
0

私は、その中にクッキーを作成して残りの操作を行うMVCコントローラを持っています。私はこのメソッドを単体テストする必要があります。私はどのようにクッキーをモックするか分からない。単体テストのモッククッキーの仕組み

これはコントローラの私の方法であって、このラインResponse.Cookies.Add(usercookie)で

public ActionResult Login(LogInRequest logInRequest) 
{ 
    if (ModelState.IsValid) 
    { 
     HttpCookie usercookie = new HttpCookie("usercookie"); 
     usercookie["UserName"] = logInRequest.UserName; 
     usercookie["Password"] = logInRequest.Password; 
     usercookie.Expires = DateTime.Now.AddMinutes(10); 
     **Response.Cookies.Add(usercookie);** 
     return RedirectToAction("search", "LoanDriver"); 
     ....... 
     return View(logInRequest); 
    } 

。それは私にNullのようなエラーを与えました。私がクッキーを追跡すると、価値があります。

そして、これは私の試験方法である:私はあなたがこれを扱うことができると思い

public static void SetFakeContext(this Controller controller) 
{ 
    var httpContext = InitialiseFakeHttpContext(); 
    ControllerContext context = 
     new ControllerContext(new RequestContext(httpContext, new RouteData()), controller); 
    controller.ControllerContext = context; 
} 

private static HttpContextBase InitialiseFakeHttpContext(string url = "") 
{ 
    var HttpContextSub = Substitute.For<HttpContextBase>(); 
    var RequestSub = Substitute.For<HttpRequestBase>(); 
    var ResponseSub = Substitute.For<HttpResponseBase>(); 
    var serverUtilitySub = Substitute.For<HttpServerUtilityBase>(); 
    var itemsSub = Substitute.For<IDictionary>(); 
    HttpContextSub.Request.Returns(RequestSub); 
    HttpContextSub.Response.Returns(ResponseSub); 
    HttpContextSub.Server.Returns(serverUtilitySub); 
    var cookie = Substitute.For<HttpResponseBase>(); 
    HttpContextSub.Response.Returns(cookie); 
    return HttpContextSub; 
} 

答えて

1

:私もなく、ANSなって、同じ問題が動作していないレスポンスにクッキーを追加しようとしました

public void Web_Login_ShouldValidateUserAndLoginSuccessfully() 
{ 
    using (var kernel = new NSubstituteMockingKernel()) 
    { 
     // Setup the dependency incjection 
     kernel.Load(new EntityFrameworkTestingNSubstituteModule()); 

     // Create test request data 
     var request = new LogInRequest { UserName = "test", Password = "test" }; 
     var fakeResponseHandler = new FakeResponseHandler(); 
     fakeResponseHandler.AddFakeResponse(new Uri("http://localhost/test"), new HttpResponseMessage(HttpStatusCode.OK)); 
     ConfigurationManager.AppSettings["SearchApiBaseUrl"] = "http://dev.loans.carfinance.com/internal"; 
     var server = new HttpServer(new HttpConfiguration(), fakeResponseHandler); 
     var httpClient = new HttpClient(server); 
     var controller = new LoanDriverController(httpClient); 
     Fake.SetFakeContext(controller); 
     var result = controller.Login(request); 
     Assert.IsNotNull(result); 
    } 
} 

コントローラでいくつかのリファクタリングを行うことで、ICookieManagerインターフェイスとCookieManagerクラス(このクラスにはクッキーを追加するロジックが含まれ、ICookieManagerインターフェイスも実装されています)を作成できます。次に、このICookieManagerを依存関係として追加するかコンストラクタまたはasプロパティと、あなたは、あなたのユニットテストでこのような何か、この依存関係を模擬することができます:あなたのコントローラで

public interface ICookieManager 
    { 
     void CreateUserCookie(string userName, string password, HttpResponseBase response, int expiration = 10); 
    } 

    public class CookieManager: ICookieManager 
    { 
     public void CreateUserCookie(string userName, string password, HttpResponseBase response, int expiration = 10) 
     { 
      HttpCookie usercookie = new HttpCookie("usercookie"); 
      usercookie["UserName"] = userName; 
      usercookie["Password"] = password; 
      usercookie.Expires = DateTime.Now.AddMinutes(expiration); 
      response.Cookies.Add(usercookie); 
     } 
    } 

:あなたのユニットテストで

public class YourController : Controller 
    { 
     public ICookieManager CookieManager { get; set; } 

     public YourController() 
     { 
      CookieManager = new CookieManager(); 
     } 

     public YourController(ICookieManager cookieManager) 
     { 
      CookieManager = cookieManager; 
     } 

     public ActionResult Login(LogInRequest logInRequest) 
     { 
      if (ModelState.IsValid) 
      { 
       CookieManager.CreateUserCookie(logInRequest.UserName, logInRequest.Password, Response); 
       return RedirectToAction("search", "LoanDriver"); 
      } 
     } 


    } 

public void Web_Login_ShouldValidateUserAndLoginSuccessfully() 
    { 
     using (var kernel = new NSubstituteMockingKernel()) 
     { 
      // Setup the dependency incjection 
      kernel.Load(new EntityFrameworkTestingNSubstituteModule()); 

      // Create test request data 
      var request = new LogInRequest { UserName = "test", Password = "test" }; 

      var fakeResponseHandler = new FakeResponseHandler(); 
      fakeResponseHandler.AddFakeResponse(new Uri("http://localhost/test"), new HttpResponseMessage(HttpStatusCode.OK)); 
      ConfigurationManager.AppSettings["SearchApiBaseUrl"] = "http://dev.loans.carfinance.com/internal"; 
      var server = new HttpServer(new HttpConfiguration(), fakeResponseHandler); 
      var httpClient = new HttpClient(server); 
      var controller = new LoanDriverController(httpClient); 
      controller.CookieManager=mockOfYourCookieManager; //here you pass the instance of the mock or also you can passe it in the constructor of the controller. 
      Fake.SetFakeContext(controller); 
      var result = controller.Login(request); 
      Assert.IsNotNull(result); 
     } 
+0

をそれは素晴らしい答えでした。ありがとう。 – Alma