如何对返回JsonResult的Action方法进行单元测试?
如果我有这样的控制器:
[HttpPost]
public JsonResult FindStuff(string query)
{
var results = _repo.GetStuff(query);
var jsonResult = results.Select(x => new
{
id = x.Id,
name = x.Foo,
type = x.Bar
}).ToList();
return Json(jsonResult);
}
基本上,我从我的存储库中获取东西,然后将其投影到一个匿名类型的List<T>
。
我该如何对其进行单元测试?
System.Web.Mvc.JsonResult
有一个名为Data
的属性,但它的类型为object
,正如我们所料。
那么这是否意味着如果我想测试JSON对象具有我期望的属性(“id”,“name”,“type”),我必须使用反射?
编辑:
这是我的测试:
// Arrange.
const string autoCompleteQuery = "soho";
// Act.
var actionResult = _controller.FindLocations(autoCompleteQuery);
// Assert.
Assert.IsNotNull(actionResult, "No ActionResult returned from action method.");
dynamic jsonCollection = actionResult.Data;
foreach (dynamic json in jsonCollection)
{
Assert.IsNotNull(json.id,
"JSON record does not contain "id" required property.");
Assert.IsNotNull(json.name,
"JSON record does not contain "name" required property.");
Assert.IsNotNull(json.type,
"JSON record does not contain "type" required property.");
}
但是我在循环中得到一个运行时错误,说明“对象不包含id的定义”。
当我断点时,actionResult.Data
被定义为匿名类型的List<T>
,所以我想如果我通过这些枚举,我可以检查属性。在循环内部,对象确实有一个名为“id”的属性 - 所以不确定问题是什么。
没有找到相关结果
已邀请:
7 个回复
仇聘发栖
,我也无法让Marc的方法工作。所以我以前是这样做的。你会发现它很有用。我刚写了一个简单的扩展方法:
然后我只是用它来对我的Json数据做断言:
搂腹时
返回一个匿名对象,默认情况下为
,因此需要使它们对测试项目可见。 打开ASP.NET MVC应用程序项目,从名为Properties的文件夹中找到
。打开AssemblyInfo.cs并将以下行添加到此文件的末尾。
引用自:http://weblogs.asp.net/gunnarpeipman/archive/2010/07/24/asp-net-mvc-using-dynamic-type-to-test-controller-actions-returning-jsonresult.aspx 我认为将这一个用于记录会很好。奇迹般有效
谷靛
属性。在这个答案中,我已经开始使用ASP.NET Core 1.0 RC2了,但我相信如果用
替换
,它应该适用于非核心版本。
用法,假设以下控制器:
测试(xUnit):
购藏盗码韦
我只是运行unittest: - 设置预期的数据结果:
- 断言结果:
信藉乒
伞腹
谷起
附:如果你使用过FluentAssertions.Mvc5就行了 - 但是把它转换成你使用的测试工具应该不难。