個人的に私のコントローラの動作をテストするために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", "");
何だろう、単一の文字列を受け取ることになる行動のためのメソッドシグネチャ$ .ajax()リクエストは? JSONよりも良い方法がありますか? – StuperUser
@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 "]'を使うべきではありません: –
ダーリンに感謝します。 MVCContribも見ていきます。 – StuperUser