我有一个从域对象获取 JSON 数据Request.Form[0]
并调用域对象的操作。
我正在测试这个方法,但是设置Request.Form似乎是不可能的。
我可以将该方法提取到另一个接受它返回的字符串的方法,但这只是一个单行方法,并且 Action 仍然未经测试。
有没有一种方法可以测试这个或另一个更可测试的方法来从$.ajax()
调用中获取 JSON 数据?
我有一个从域对象获取 JSON 数据Request.Form[0]
并调用域对象的操作。
我正在测试这个方法,但是设置Request.Form似乎是不可能的。
我可以将该方法提取到另一个接受它返回的字符串的方法,但这只是一个单行方法,并且 Action 仍然未经测试。
有没有一种方法可以测试这个或另一个更可测试的方法来从$.ajax()
调用中获取 JSON 数据?
我个人使用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", "");
可以通过将强类型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
}
});