2010-07-07 2 views
2

안녕하세요 내가 테스트를 작성하려고하면 HttpRequestBase를 모의 해 다음과 같은 값을 반환 할 수 있습니까? 그것의 아주 긴급한 도움을주십시오, 어떻게 이것을 달성 할 수 있습니까? asp.net mvc rhino mocking httprequest 값

var collection = new NameValueCollection(); 
collection.Add("Id", "1"); 
collection.Add("UserName", ""); 


var mocks = new MockRepository(); 

    using (mocks.Record()) 
    { 
     Expect.Call(requestBase.Params).Return(collection); 
    } 

기본적으로 내가 어떻게 가짜 아이디어, 사용자 인터페이스 클라이언트가 HTML 양식을하지 않습니다로 값을 형성하기 위해 반대로 모의 요청 POST 매개 변수에 저를 rquires 요구 사항을 /를 HttpRequest를 포스트 PARAMS을 조롱? 반환 유형은 nameVaueCollection입니다.

+0

컨트롤러를 테스트하기 위해 모의하려고하십니까? –

+0

실제로 컨트롤러 동작에서 http 컨텍스트를 직접 사용해야하는 경우는 거의 없습니다. 그것이 내가 확인할 것 인 첫번째 물건이다. "정말이 의존성이 필요한가요?" –

+0

안녕 얘들 아 고마워, 필자는 질문을 업데이 트 기본적으로 나는 UI 클라이언트가 HTML 양식, 어떤 아이디어가 가짜/모의 httprequest 게시물 params 방법이 아니므로 값을 양식에 반하는 게시 요청 매개 변수를 모의 난 rquires 요구 사항이 있습니까? 리턴 타입은 nameVaueCollection – Matthew

답변

6

당신은이 말을 듣기 좋아하지 않을 것입니다. 그러나 당신은 잘못된 방향으로 가고 있습니다. 입력에 모델을 사용하고 요청 매개 변수에서 직접 값을 가져 오는 대신 모델 바인더가 특성을 채우도록해야합니다. 이것은 당신이 HttpRequest 객체를 조롱하지 않고 액션 메소드의 매개 변수로서 모델을 제공 할 것이기 때문에 조롱을 포함한 당신의 삶을 훨씬 더 쉽게 만들어 줄 것이다.

var model = new UserModel { ID = 1, UserName = string.Empty }; 

var controller = new FooController(); 

var result = controller.FooAction(model); 

매개 변수를 사용해야하는 경우 최소한 모의 객체에 대해 AAA 구문을 사용하는 것이 좋습니다.

var request = MockRepository.GenerateMock<HttpRequestBase>(); 
var context = MockRepository.GenerateMock<HttpContextBase>(); 

var collection = new NameValueCollection(); 
collection.Add("Id", "1"); 
collection.Add("UserName", ""); 

context.Expect(c => c.Request).Return(request).Repeat.Any(); 
request.Expect(r => r.Params).Return(collection).Repeat.Any() 

var controller = new FooController(); 
controller.ControllerContext = new ControllerContext(context, new RouteData(), controller); 

var result = controller.FooAction(); 

... 

context.VerifyAllExpectations(); 
request.VerifyAllExpectations(); 
+0

HttpContext를 사용하는 컨트롤러가 아닌 클래스의 메서드가 있으면 어떻게 httpContext를 모의합니까? – Monish

+0

@Monish that maks simpler, HttpContextBase를 생성자에 주입하고 테스트중인 클래스를 만들 때 그냥 mock을 제공하십시오. – tvanfosson

+0

응답을 보내 주셔서 감사합니다. tvanfosson. 그러나 제 질문은 다소 다릅니다. 공용 클래스 (컨트롤러가 아닌)에 대한 Unit 테스트를 작성했습니다. 실제로이 클래스의 메서드는 컨트롤러의 동작에서 호출됩니다. 하지만 내 단위 테스트에는 컨트롤러가 없습니다. 나는 공개 수업을 직접 테스트하고있다. 이 클래스의 한 메소드는 HttpContext를 사용합니다. – Monish