2011-01-19 4 views
1

私はRequest.Form[0]からJSONデータを取得し、ドメインオブジェクトを呼び出すアクションを持っています。Controllerをテストする方法Request.FormのJSON文字列を使用するアクション?

このメソッドをテストしていますが、Request.Formを設定することは不可能です。

返す文字列を受け取る別のメソッドにメソッドを抽出することはできますが、これは1行のメソッドであり、Actionはまだテストされていません。

$.ajax()呼び出しからJSONデータを取得する方法をテストする方法がありますか?

答えて

0

それは強く型付けされたに合格することが可能ですパラメータパラメータ

public JsonResult ActionName(string paramName)

として、それを追加し、データに含めて、メソッドに書き込む:

var dataVar = getDataVar(); 
$.ajax({ 
    url: '/Controller/ActionName' 
    , type: 'post' 
    , data: { paramName: dataVar } 
    , dataType: 'json' 

    , success: function (returnJSON) { 
    } 
    , error: function (XMLHttpRequest, textStatus, errorThrown) { 
    //error handle in here 
    } 
}); 
2

個人的に私のコントローラの動作をテストするためにMVCContrib TestHelperを使用してください。物事はとても楽しく簡単です。

あなたのケースでは、次のコントローラを想定しています(免責事項:実際のアプリケーションでこれを絶対に書き込まないでください、実際のアプリケーションコントローラのアクションではRequest.Formから物をフェッチしないでください) )...など、解析を行うアクションパラメータを入力し、デフォルトのモデルバインダーを残す:

public class MyViewModel 
{ 
    public string SomeProperty { get; set; } 
} 

public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var json = Request.Form[0]; 
     var model = new JavaScriptSerializer().Deserialize<MyViewModel>(json); 
     return View(model); 
    } 
} 

あなたはこのようにそれをテストすることができます:

// arrange 
var builder = new TestControllerBuilder(); 
var sut = new HomeController(); 
builder.InitializeController(sut); 
builder.Form.Add("foo", "{ someProperty: 'some value' }"); 

// act 
var actual = sut.Index(); 

// assert 
actual 
    .AssertViewRendered() 
    .WithViewData<MyViewModel>() 
    .SomeProperty 
    .ShouldEqual("some value", ""); 
+0

何だろう、単一の文字列を受け取ることになる行動のためのメソッドシグネチャ$ .ajax()リクエストは? JSONよりも良い方法がありますか? – StuperUser

+0

@StuperUser、このように: 'public ActionResult Index(MyViewModelモデル){...}'。 ASP.NET MVC 3では、デフォルトのモデルバインダーは[JSONを解析できる](http://davidhayden.com/blog/dave/archive/2011/01/07/JsonValueProviderFactoryASPNETMVC3.aspx)です。古いバージョンを使用している場合は、[custom JsonValueProviderFactory](http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method- argument.aspx)。しかしどちらの場合でも、コントローラアクションで 'Request.Form [0]'または 'Request.Form [" foo "]'を使うべきではありません: –

+0

ダーリンに感謝します。 MVCContribも見ていきます。 – StuperUser

関連する問題