2010-08-20 4 views
1

ASP.NET MVC는 단위 테스트 프레임 워크가되기 위해 먼 길을왔다 (webform과 비교하여). 그러나 FormsAuthentication과 같은 일부 돼지는 종종 깨끗하고 테스트 가능한 상태로 유지하기 위해 일부 유형의 UserSession 객체를 래핑합니다. 다른 날 저는 컨트롤러 액션에서 Server.MapPath를 사용하고 MvcContrib과 같은 것들이 현재 요청을 모의하기 쉽도록 만들었지 만 FileSystemService 클래스를 생성하는 경로를 따라 가면서 파일 시스템. 장점은 필요한 메소드를 제공하는 엄격한 API를 얻고 테스트에서 스텁/모의하기가 쉽다는 것입니다. 단점은 그것이 또 다른 생성자 의존성이라는 것입니다.ASP.NET MVC 유닛 테스트 및 HttpContext

이 상황에 대한 SO 커뮤니티의 취지는 무엇입니까? 컨트롤러를 가능한 한 가볍고 유연하게 만들 때 어디에서 선을 그어야합니까?

+0

확실히 주관적입니다. 가벼운/유연한 컨트롤러 란 무엇입니까? 그게 논쟁의 여지가있다. – jfar

+0

좀 더 구체적으로 말하면, Request/HttpContext – RickP

+0

Ok에 의존하는 정적 프레임 워크 메서드에서 벗어나려는 시도를 중단 할 때 질문을 변경하십시오. – jfar

답변

1

나는 일반적으로 당신이 실제로 수행 뭔가를 얻을 필요가 지점에서 선을 그어야 할이 (즉, 누군가가 당신이 작성하는 코드를 사용하고 싶어). 이 서비스 등을 작성하는 일 다른 반 소요 경우 마감일은 마음에

1

곰 ASP.NET MVC는 이미 많은 테스트 -와 HttpContext를 봉인 변경되었음을 ... 다음 몇 가지 가장 남아있는, 다가오고 당신은 서버의 선택한 구현과 테스트를 제공하기 위해 조롱 할 수 친화적 인 HttpContextBase, * 요청 * 응답 * 등

당신은 당신의 테스트 환경을 제공하기 위해 컨트롤러의 ControllerContext을 설정해야합니다

:...

controllerUnderTest.ControllerContext = new ControllerContext(testHttpContext, new RouteData(), controllerUnderTest); 
0

위대한 질문입니다. 나는 HttpContext 종속성을 감추고, 뒤집어 놓고 조롱 할 수 있도록 랩핑하는 것과 같은 일을합니다.

나는 포스트 값의 유효성을 검사하고 저장하거나 작업 층에 떨어져 전화를 통과에서 컨트롤러 라인을 그립니다. 따라서 내가 선호하는 고객이 구매하고, 뭔가를 기록하는 등의 경우, 유효성을 검사하고, 일부 데이터를 저장하고, 마케팅에 이메일을 보내야합니다. 너무 많이합니다. 나는 그것을 작업 계층에 넣고 그 작업 계층을 내 컨트롤러에 호출하게했습니다. 대부분의 종속성은 작업 계층 생성자로 이동하여 컨트롤러 밖으로 나옵니다.

엄지 내 일반적인 규칙이있다 : 당신은 당신이 완전히 다시 작성 될 앱에 실버 또는 다른 UI를 만들도록 요청한다면? 컨트롤러는 프리젠 테이션 로직을 고수해야합니다. 프리젠 테이션 레이어를 긁어내어 다른 레이어를 놓으면 미래의 최상의 교정을 제공합니다.

물론, 당신이 그릴 곳은 당신과 당신의 앱입니다. 작업 계층과 스키니 컨트롤러에 대한 자세한 내용은 Sharp Architecture을 기반으로 한 Who Can Help Me을 참조하십시오.

0

쉽게 테스트하는 것도 HttpContext를 같은 것들을 주변이 래퍼가 있습니다

http://www.codethinked.com/post/2008/12/04/Using-SystemWebAbstractions-in-Your-WebForms-Apps.aspx

그래서 그것을 정리해 :

System.Web를 가져옵니다.추상화

매개 변수로

사용 HttpContext에 기반하지으로 HttpContext :

public void SomeMethod(HttpContextBase context) 
{ 
} 

전화 당신은 너무 (예 MOQ를 사용하여) 같은 가짜를 제공 할 수 있습니다

HttpContextBase contextBase = new HttpContextWrapper(context); 
SomeMethod(contextBase); 

실제 HTTP 컨텍스트를 포장하는 방법 :

var context = new Mock<HttpContextBase>(); 
context.Setup(x => x.Request.QueryString).Returns(new NameValueCollection { { "Id", "5" } }); 
관련 문제