익명 유형을 포함하는 JsonResult의 아사트
컨트롤러 중 하나에서 JsonResult를 반환하는 메서드를 유닛 테스트하려고 했습니다.놀랍게도 다음 코드가 작동하지 않았습니다.
[HttpPost]
public JsonResult Test() {
return Json(new {Id = 123});
}
테스트 방법은 다음과 같습니다(테스트 코드는 다른 어셈블리에 있습니다).
// Act
dynamic jsonResult = testController.Test().Data;
// Assert
Assert.AreEqual(123, jsonResult.Id);
그Assert
는 예외를 발생시킵니다.
'object'에 'Id'에 대한 정의가 없습니다.
그 후 다음을 사용하여 해결했습니다.
[HttpPost]
public JsonResult Test() {
dynamic data = new ExpandoObject();
data.Id = 123;
return Json(data);
}
왜 첫 번째 것이 작동하지 않는지 이해하려고 노력 중입니다.또한 기본적으로 익명의 유형을 제외한 모든 유형에서 작동하는 것처럼 보입니다.
분명히 하자면 C#다이나믹이 퍼블릭멤버 이외의 멤버에서는 동작하지 않는 것이 문제입니다.이것은 아마도 그런 종류의 일을 막기 위한 의도적인 것이다.LukLed가 말했듯이 익명의 유형은 동일한 어셈블리 내에서만 공개됩니다(정확히 말하면 익명의 유형은 단순히 마킹되어 있습니다).internal
,것은 아니다.public
)는, 이 장벽에 부딪힙니다.
아마도 가장 깨끗한 솔루션은 다음과 같습니다.InternalsVisibleTo
. 공개되지 않은 멤버에 액세스할 수 있는 다른 어셈블리의 이름을 지정할 수 있습니다.테스트에 사용하는 것이 그 존재의 주된 이유 중 하나입니다.이 예에서는 프라이머리 프로젝트의 AssemblyInfo.cs에 다음 행을 입력합니다.
[assembly: InternalsVisibleTo("AssemblyNameOfYourTestProject")]
이렇게 하면 오류가 사라집니다(제가 직접 시도했습니다).
또는 무차별적인 힘의 반사를 사용할 수도 있습니다.
Assert.AreEqual(123, jsonResult.GetType().GetProperty("Id").GetValue(jsonResult, null));
여기서의 답변을 읽고 나서, 한층 더 먼 곳을 찾아본 결과, 또 다른 어프로치의 2009년 msdn 블로그 투고를 발견했습니다.하지만, 코멘트에는, Kieran의 매우 심플하고 우아한 솔루션이 있었습니다..ToString()
.
원래의 경우:
[HttpPost]
public JsonResult Test()
{
return Json(new {Id = 123});
}
다음을 수행하여 테스트할 수 있습니다.
var jsonResult = controller.Test();
Assert.AreEqual("{Id = 123}", jsonResult.Data.ToString());
저는 이 솔루션을 매우 선호합니다.
- 원래 코드를 변경하지 않도록 합니다(
InternalsVisibleTo
,ExpandoObject
), - MvcContrib 및 RhinoMocks를 사용하지 않도록 합니다(이것들 중 어느 것도 문제 없습니다만, 테스트하기 위해서 추가하는 이유는 무엇입니까).
JsonResult
?) 및 - 는 Reflection을 사용하지 않도록 합니다(테스트의 복잡성 추가).
익명 유형은 내부이므로 다른 라이브러리(테스트가 있는 라이브러리)에 노출할 수 없습니다.테스트 코드를 컨트롤러와 같은 라이브러리에 배치하면 동작합니다.
언급URL : https://stackoverflow.com/questions/16876144/asserting-jsonresult-containing-anonymous-type
'programing' 카테고리의 다른 글
$sce.trustAsResourceUrl() 글로벌 (0) | 2023.02.21 |
---|---|
onEnter가 React-Router에서 호출되지 않음 (0) | 2023.02.21 |
ng-배열이 비어 있는지 확인합니다. (0) | 2023.02.21 |
Material-UI에서 대화상자의 높이를 설정하려면 어떻게 해야 합니까? (0) | 2023.02.21 |
s3에서 가져온 이미지 표시 (0) | 2023.02.21 |