2011-05-16 6 views
6

제 신청서에 약간의 문제가 있습니다.Asp.Net MVC 뷰가 예외없이 렌더링되는지 어떻게 테스트 할 수 있습니까?

내 기본 응용 프로그램의 네임 스페이스를 MyApp.Models에서 MyApp.ViewModels으로 변경하여 네임 스페이스의 전체적인 혼동을 덜어주었습니다 (네임 스페이스는보기 모델과 비즈니스 모델 만 갖기 때문에). 내 견해를 포함하여 찾을 수있는 모든 참조를 변경했으며 모든 단위 테스트를 다시 실행하여 응용 프로그램을 검토했으며 모두 정상적으로 보였습니다.

며칠 후 등록 페이지에 오류가 발생했다는보고가있었습니다. 보고 나서 네임 스페이스를 등록 페이지에서 수정하는 것을 잊어 버렸고 뷰를 컴파일하지 못했습니다.

걱정됩니다. 단위 테스팅의 전체적인 요점이자 Asp.Net MVC의 가장 큰 매력 중 하나는 모든 것이 개별적으로 자동 테스트되도록함으로써 애플리케이션에 대한 확신을 가질 수 있도록하는 것입니다. 그러면 수정으로 인해 시스템의 일부가 중단되는 즉시 알 수 있습니다. 현재 뷰는이 점에서 중요한 구멍처럼 보입니다.

분명히 말하자면, 미리보기를 미리 컴파일 할 수 있다는 것을 알고 있습니다. 그러나, 나는 항상 새로운 빌드를 매우 느리게 컴파일하기 때문에이 옵션을 사용하는 것은 좋지 않으므로이 옵션이 마음에 들지 않으며 별도의 구성 스키마가 있어야 사용자에게 달려 있다는 것을 의미합니다. 해당 구성 체계로 컴파일하여 뷰 컴파일 오류를 확인하도록하십시오.

이는 또한 발생할 수있는 런타임 오류를 완전히 검사하지 않습니다. 예를 들어, 강력한 형식의 뷰가 기대하는 뷰 모델을 변경한다고 가정 해 보겠습니다. 그런 다음 Controller.Action()이 올바른보기 모델 유형의보기 결과를 반환하는지 확인하기 위해 단위 테스트를 업데이트하지만 실제보기가 새보기에 대해 올바르게 업데이트되었는지 확인하지는 못하더라도이 시나리오로 인해 런타임 예외. 이는 특히 두 뷰 모델의 차이점이 뷰 내에서 사용되는 부분 뷰에서만 나타나는 경우에 발생하기 쉬운 시나리오입니다.

런타임 예외를 일으킬 수있는 코드의 다른 예로는 (뷰 모델의 변경으로 인한) 잘못된 루프, 사용자의 역할을 확인하는 코드 (자격 증명이있는 사용자 만 버튼이 표시됨), 잘못된 캐스트 콜렉션을 선택 목록으로 변환하는 경우), 콜렉션을 정렬하는 잘못된 코드 (콜렉션이 디스플레이에서 정렬되는 방식은 제어기 또는 뷰 모델 관심사가 아닌보기 관심사로 해석 될 수 있음), 파일 위치에 사용 된 문자열이없는 경우 제대로 작동하지 않습니다. (T4MVC는 Telerik의 스크립트 등록 시스템과 같은 일부 기능과 잘 통합되지 않습니다.)

내가 보는 방식대로 프로세스에서 예외가 발생할 수있는 많은 것들이 있습니다 보기를 렌더링하는 것, 그리고 나는 창조하는 어떤 방법도 찾을 수없는 것처럼 보입니다. 이러한 현상이 발생하는시기를 결정하기 위해 단위 또는 통합 테스트를 수행했습니다. 모든 페이지에서 표준 단위 테스트가 잡을 수있는 컴파일 시간이나 런타임 오류를 놓쳤는 지 확인하지 않아도된다면 더 편하게 느낄 것입니다.

어떤 옵션이 필요합니까?

WaTiN 및 다른 GUI 테스트 도구를 사용하지 않는 것이 좋습니다. 실제 페이지 표시에 관심이 없습니다.보기가 렌더링되는지 또는 예외가 발생하는지 알고 싶을뿐입니다. 각 테스트를 위해 IE 인스턴스를 실행하는 Watin의 오버 헤드가 필요합니다. (나중에 계속 통합하면이 문제가 발생할 것이라고 생각합니다.)당신이 WaTIN와 IE를 사용하지 않을 경우

답변

3

는 IIS Express에서 귀하의 웹 사이트를 발사 한 후 결과를 확인하기 위해 뷰 '각 URL을 통해 HttpWebRequest 사용에 대한 200 OK 방법 . 이것은 완전한 통합 테스트입니다.

그렇지 않으면, 당신은 당신의 컨트롤러에서 ViewResult를 얻을 수 및 스텁 HttpContextBase을 포함하는 ControllerContext에서 ExecuteResult 방법 통과를 호출해야합니다. 이것은 진정한 단위 테스트를 더 많이 제공하며 더 빠를 것입니다. 그러나 작동하기 전에 조롱과 스터 빙을 많이해야합니다.

+0

Ah'ViewResult'에서'ExecuteResult' 메쏘드를 보지 못했습니다. 나는 그것을 들여다 볼 것이다! – KallDrexx

+0

'ViewResult.ExecuteResult()'유닛 테스트를 시도한 결과, 나는 포기했다. 'ViewResult.FindView()'코드의 어떤 부분은 프레임 워크의 깊은 곳에서 널 참조 예외를 발생시킵니다. 귀하의 첫 번째 옵션이 최선 (또는 구현하기 쉽습니다) 같아요. http://www.reimers.dk/blogs/jacob_reimers_weblog/archive/2010/11/10/testing-your-web-application-with-iis-express-and-unit-tests.aspx에서이 작업을 수행 할 수있는 코드를 찾았습니다. – KallDrexx

+0

불운. 나는 나 자신을 시도하고 실패한 느낌이 들었다. ASP.NET은 조롱을 받기 위해 만들어지지 않았습니다. 저는 항상 간단한 WaTIN 테스트를 사용했습니다. 그러나 필요한 모든 것이 간단한 성공/실패 테스트라면,'HttpWebRequest' 나'HttpClient'가 여러분에게 잘 맞을 것입니다. –

1
+0

컨트롤러가 특정 모델 유형으로보기를 호출하고 있지만보기에서 실제 모델을 예상하고 있는지 검사하지 않는 것으로 나타납니다. – KallDrexx

관련 문제