如何测试使用Request.Form中的JSON字符串的Controller Action?

时间:2011-01-19 16:55:53

标签: jquery asp.net-mvc unit-testing json testability

我有一个Action,它从Request.Form[0]获取JSON数据并调用域对象。

我正在测试此方法,但似乎无法设置Request.Form。

我可以将方法提取到另一个接收它返回的字符串的方法,但这只是一行方法而且Action仍然是未经测试的。

是否有方法可以测试这种或另一种更可测试的方法来从$.ajax()调用中获取JSON数据?

2 个答案:

答案 0 :(得分: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", "");

答案 1 :(得分:0)

可以将强类型string参数传递给方法,方法是将其作为参数添加

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
    }
});