2011-12-14 17 views
6

Moqを使用してMVCフォームの投稿を模擬する方法を教えてください。Moqを使ってMVCフォームPOSTを模擬する方法

私が望むのは、いくつかの異なるフォーム投稿に基づいて私の方法をユニットテストすることです。

私はGoogleにこれを試してみましたが、そこにはトップダウンガイドがありません。

おかげ

EDIT:追加のコード

[TestMethod] 
    public void SubscriptionControllerTest() 
    { 
     var subscriptionViewModel = new SubscriptionViewModel(); 

     //HTTP REQUEST SET UP 
     var httpRequest = new Mock<HttpRequestBase>(); 

     httpRequest.Setup(r => r.Path).Returns("/Subscription/SendEmail"); 

     httpRequest.Setup(r => r.Form).Returns(delegate() 
     { 
      var nv = new NameValueCollection(); 
      nv.Add("FirstName", "John"); 
      nv.Add("LastName", "Smith"); 
      nv.Add("Email", "[email protected]"); 
      nv.Add("Comments", "Comments are here..."); 
      nv.Add("ReceiveUpdates", "true"); 
      return nv; 
     }); 


     //HTTP CONTEXT SET UP 
     var httpContext = new Mock<HttpContextBase>(); 

     httpContext.Setup(c => c.Request).Returns(httpRequest.Object); 

     var subscriptionController = new Mock<SubscriptionController>(); 
     subscriptionController.Setup(s => s.HttpContext).Returns(httpContext.Object); 

     var result = subscriptionController.Object.SendEmail(subscriptionViewModel); 

     Assert.AreEqual(((ViewResult)result).ViewName, "Index"); 

    } 
} 

私はSubscriptionControllerと呼ばれるコントローラを持っています。 そこにはSendEmailというアクションメソッドがあります。 上記のこのテスト方法を使用してSubscription/SendEmailを実行したいと考えています。 私のビューは、名前、姓、電子メール、コメント、チェックボックスの各フィールドを持つフォームです。 私はこのフォームを嘲笑し、私のコントローラー、httpリクエストとコンテキストをモックする必要があります。私は何を嘲笑して何を本当のものとして使うのかちょっと混乱しています。すべての説明をありがとう。

+0

モックしようとしているクラス(または関連する部分)を投稿できますか? –

答えて

6

回答:Request.Formのフォーム値を直接設定することで、フォーム投稿を模擬することができます。私がHttpRequestを嘲笑する前に、フォームの値を設定し、httpRequestオブジェクトをHttpContextオブジェクトにリンクしていました。このアプローチはうまくいかなかった。

私は以下の解決策を掲載しています。私が以前に行ったことを比較すれば分かります。

[TestMethod] 
public void TestSendSubscriptionEmail() 
{ 
    //HTTP CONTEXT SET UP 
    var httpContext = new Mock<HttpContextBase>();   

    var routeData = new RouteData(); 
    httpContext.Setup(c => c.Request.RequestContext.RouteData).Returns(routeData); 

    httpContext.Setup(c => c.Request.Form).Returns(delegate() 
    { 
     var nv = new NameValueCollection(); 
     nv.Add("FirstName", "John"); 
     nv.Add("LastName", "Smith"); 
     nv.Add("Email", "[email protected]"); 
     nv.Add("Comments", "Comments are here..."); 
     nv.Add("ReceiveUpdates", "true"); 
     return nv; 
    }); 

    httpContext.Setup(c => c.Request.Path).Returns("/Subscription/SendEmail"); 

    var subscriptionViewModel = new Mock<ISubscriptionViewModel>(); 

    subscriptionViewModel.Setup(h => h.HttpContext).Returns(httpContext.Object); 

    subscriptionViewModel.Setup(h => h.FirstName).Returns(httpContext.Object.Request.Form["FirstName"]); 
    subscriptionViewModel.Setup(h => h.LastName).Returns(httpContext.Object.Request.Form["LastName"]); 
    subscriptionViewModel.Setup(h => h.Email).Returns(httpContext.Object.Request.Form["Email"]); 
    subscriptionViewModel.Setup(h => h.Comments).Returns(httpContext.Object.Request.Form["Comments"]); 
    subscriptionViewModel.Setup(h => h.InvestmentUpdates).Returns(bool.Parse(httpContext.Object.Request.Form["ReceiveUpdates"])); 

    var subscriptionController = new SubscriptionController(subscriptionViewModel.Object); 

    var result = subscriptionController.SendEmail(subscriptionViewModel.Object); 

    Assert.AreEqual(((ViewResult)result).ViewName, "Index"); 

} 
関連する問題