: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"라는 속성이 있으므로 문제가 무엇인지 확실하지 않습니다.
다시 편집 - var items = (IEnumerable) actionResult.Data와 같은 것을 시도해 볼 수 있습니다. foreach (동적 obj 항목) {...} –
여기에서 ' '으로 테스트했습니다. var list = (IList) data; Assert.AreEqual (list.Count, 2); 동적 obj = 데이터 [0]; Assert.AreEqual (obj.id, 12); Assert.AreEqual (obj.name, "Fred"); Assert.AreEqual (obj.type, 'a'); obj = 데이터 [1]; Assert.AreEqual (obj.id, 14); Assert.AreEqual (obj.name, "Jim"); Assert.AreEqual (obj.type, 'c'); foreach (목록에 동적 d) { if (d.id == null) throw new InvalidOperationException(); }'괜찮 았던 것처럼 보였습니다 ... –
내일 내가 사무실에 도착했을 때 그 코드를 사용해 보도록하겠습니다. 건배. – RPM1984