2014-02-06 2 views
2

일부 단위 테스트를 작성 중이며 조건이 참일 경우 컨트롤러 작업은 HttpNotFoundResult을 반환해야합니다. 그렇지 않으면 ViewResult을 반환하고 그 안에 특정 모델이 있어야합니다.ViewResult로 ActionResult가 null을 반환하지만 명시 적으로 캐스팅 할 수 있습니까?

ViewResult을 반환해야하는 시나리오를 테스트하는 테스트 중 하나로서 작업을 실행 한 다음 결과를 ViewResult으로 캐스팅하고 테스트합니다. 그러나 var result = myController.MyAction() as ViewResult (resultActionResult 인 경우)을 사용하면 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

+0

'as' 연산자는 캐스트 연산과 같습니다. 그러나 변환이 불가능한 경우에는 예외가 발생하는 대신 'null'을 반환합니다. – Satpal

+1

그렇습니다. 그러나'ActionResult'와'ViewResult' 사이의 명시 적 형변환은 예외를 발생시키지 않습니다. 사실, 잘 동작합니다. 그렇다면'ActionResult as ViewResult'는 null을 리턴하는 이유는 무엇입니까? –

+0

'ViewResult'는'ActionResult'를 상속받습니다. 그래서'as'는 항상 그것을 캐스트 할 수 있어야합니다. * 정확한 * 코드 또는 컴파일 가능한 데모를 게시 할 수 있습니까? (게시 한 코드는 컴파일되지 않으므로 컴파일 할 수 없습니다). –

답변

2

누구도 대답하지 않았습니다. ASP MVC를 ASP MVC 5로 업데이트 했으므로 테스트가 성공했습니다. 테스트 프로젝트에서 ASP MVC 5를 사용하고 있지만 컨트롤러가 포함 된 프로젝트에서 ASP MVC 4가 실행 중이고 컨트롤러 바이너리가 다른 컨트롤러 클래스에서 ViewResultActionResult의 그림자로 반환 할 수 있지만 테스트 프로젝트는 ViewResult에서 ActionResult으로 변환 할 수 없기 때문에 ViewResult의 이해가 다릅니다.

비록이 경우에는 빌드 오류가 발생한다고 가정하기 때문에 이것은 어리석은 것처럼 보이지만.

오, 업그레이드되었습니다.

+0

입니다. 내 두 프로젝트 모두 mvc5를 사용하고 있는데 단위 테스트 케이스에 null이 표시되는 이유는 무엇입니까? – Neo

관련 문제