2011-01-06 5 views
8

ASP.NET MVC2 응용 프로그램의 액션 메서드는 JsonResult 객체를 반환하고 단위 테스트에서는 반환 된 JSON 객체에 예상 값이 실제로 포함되어 있는지 확인하고 싶습니다. "dynamic"키워드 및 JSON 데이터

나는이 시도 :

1. dynamic json = ((JsonResult)myActionResult).Data; 
2. Assert.AreEqual(JsonMessagesHelper.ErrorLevel.ERROR.ToString(), json.ErrorLevel); 

을하지만 나는 RuntimeBinderException " '개체' 'ErrorLevel에'에 대한 정의가 포함되어 있지 않습니다"얻는다.

단 I은 라인 (2)에 브레이크 포인트를 배치하고 JSON 동적 변수를 조사하면, 그것이 명백하게 가 ErrorLevel에 문자열을 포함 않는다 (아래 그림 참조)는, 기대 값을 갖는다 런타임 바인더 아니라면 그래서 테스트가 재미있을거야.

Snapshot of the Locals debugger window

나는 무엇을받지는 무엇입니까? 내가 뭘 잘못하고 어떻게 해결할 수 있니? 어설 션을 어떻게 통과시킬 수 있습니까?

답변

15

정말 동적 인 것은 아닙니다. 여기에 예제가 있습니다.

public ActionResult Index() 
{ 
    return Json(new { Id = 5, Foo = "bar" }); 
} 

및 해당 시험 :

// act 
var actual = subjectUnderTest.Index(); 

// assert 
var data = new RouteValueDictionary(actual.Data); 
Assert.AreEqual(5, data["Id"]); 
Assert.AreEqual("bar", data["Foo"]); 

은 또한 당신이 following blog post 유용을 찾을 수 있습니다 당신은 당신이에 단위 테스트를하고자 다음과 같은 조치를했다 가정하자.

+3

※ * 작동합니다. 그리고 그것이 어떻게 작동하는지는 알지만 여전히 상당히 해킹 된 것처럼 보입니다. RouteValueDictionary를 사용하여 익명 객체의 내용을 쿼리하는 것은 매우 직관적이며 직관적입니다 ...이 솔루션을 기억하기를 희망합니다. 익명의 개체 (System.Web.dll에 숨겨져 있지 않은 개체)와 동일한 트릭을 수행하는 다른 클래스가 있습니까? (이상한 것은 System.Web.Routing 네임 스페이스에 있지만 System.Web.Routing.dll에는 존재하지 않는다) –

2

JsonResultData 속성은 Object 유형입니다. 즉, 동적 선언이 있지만 설정되는 유형은 여전히 ​​Object입니다. 다른 문제는 익명 형식을 Data으로 사용하고 해당 범위 외부에서 선언 된 인스턴스로 액세스하려고하는 것입니다. RouteValueDictionary을 사용하여 @ Darin의 기술 값을 사용하여 속성 값에 액세스하십시오.