일부 단위 테스트를 작성 중이며 조건이 참일 경우 컨트롤러 작업은 HttpNotFoundResult
을 반환해야합니다. 그렇지 않으면 ViewResult
을 반환하고 그 안에 특정 모델이 있어야합니다.ViewResult로 ActionResult가 null을 반환하지만 명시 적으로 캐스팅 할 수 있습니까?
ViewResult
을 반환해야하는 시나리오를 테스트하는 테스트 중 하나로서 작업을 실행 한 다음 결과를 ViewResult
으로 캐스팅하고 테스트합니다. 그러나 var result = myController.MyAction() as ViewResult
(result
이 ActionResult
인 경우)을 사용하면 result
은 항상 null로 평가되지만, var result = (ViewResult)myController.MyAction()
을 수행하면 결과가 올바르게 캐스팅됩니다.
왜 이런가요? as
의 사용법을 제대로 이해하지 못합니까?
관련 코드 :
// My controller
public class MyController
{
..
public ActionResult MyAction(bool condition)
{
if(condition)
return HttpNotFound()
return View(new object());
}
}
// My test
public void MyTest()
{
....
var controller = new MyController();
var result = controller.MyAction(false) as ViewResult;
// result should be casted successfully by as, but it's not, instead it's unll
// however, this works
var result = (ViewResult) controller.MyAction(false);
// why is this?
}
편집 : 요점에 전체 예. 죄송합니다, 구문 강조와 같은 것은 아닙니다. https://gist.github.com/DanPantry/dcd1d55651d220835899
'as' 연산자는 캐스트 연산과 같습니다. 그러나 변환이 불가능한 경우에는 예외가 발생하는 대신 'null'을 반환합니다. – Satpal
그렇습니다. 그러나'ActionResult'와'ViewResult' 사이의 명시 적 형변환은 예외를 발생시키지 않습니다. 사실, 잘 동작합니다. 그렇다면'ActionResult as ViewResult'는 null을 리턴하는 이유는 무엇입니까? –
'ViewResult'는'ActionResult'를 상속받습니다. 그래서'as'는 항상 그것을 캐스트 할 수 있어야합니다. * 정확한 * 코드 또는 컴파일 가능한 데모를 게시 할 수 있습니까? (게시 한 코드는 컴파일되지 않으므로 컴파일 할 수 없습니다). –