2010-12-28 4 views
1

FormCollection을 매개 변수로 사용할 수있는 컨트롤러 메서드가 있습니다. 그러면 컨트롤러 메서드가 UpdateModel (Model, new [] {P1, P2})을 사용하여 모델을 작성합니다.FormCollection 인수가있는 MVC 단위 테스트 컨트롤러 메서드

위의 방법을 단위 테스트하고 싶습니다. P1 및 P2 값으로 formcollection을 채우지 만 단위 테스트에서 모델을 호출하면 모델이 올바르게 빌드되지 않습니다.

비슷한 문제가있는 사람이 있습니까?

답변

3

UpdateModel 메서드는 모델을 채울 때 Request 개체를 조사하고 통과하는이 FormCollection을 완전히 무시합니다. 따라서 요청을 조롱하고이 객체에 값을 추가해야합니다. 하지만 노력과 내가 당신에게 더 나은 방법을 추천 할 것입니다 가치가없는 일 이잖아 많은 : 대신 액션 내부 UpdateModel를 호출 한 후 작업을 매개 변수로 FormCollection를 사용 및 사용 강력한 형식의 액션 매개 변수 :

public ActionResult Foo(SomeViewModel model) 
{ 
    // The model binder will automatically call UpdateModel and populate 
    // the model from the request so that you don't need to manually 
    // do all this stuff 
    ... 
} 

및 단위 테스트에서 컨트롤러 동작을 호출 할 때 원하는 모델을 전달하기 만하면됩니다.

+0

심지어 모델 접근 방식을 선호하지만 관리자가 요청을 변조하고 수정하는 경우 관리자가 말합니다. UpdateModel을 사용하면 모델을 빌드 할 때 컨트롤이 있습니다. 확실하지 않음 "관리자"를 설득하는 방법 – Snehal

+1

@ 숨,보기 모델을 사용해야합니다. 그것들은보기의 필요에 특별히 맞춘 수업입니다. 이러한 클래스에는 뷰에서 바인딩해야하는 속성 만 포함됩니다. 그래서 당신은 완전히 제어 할 수 있습니다. 'FormCollection'을 사용하는 것보다 훨씬 더 깔끔한 접근법입니다. 관리자는 ASP.NET MVC에 대해 더 자세히 읽어야합니다 :-). 또한 [BindAttribute] (http://msdn.microsoft.com/en-us/library/system.web.mvc.bindattribute.aspx)를 사용하면 바인딩에 포함되거나 제외되어야하는 속성을 선택할 수 있지만 솔직하게 뷰 모델을 사용하면 아무런 문제가 발생하지 않습니다. –

관련 문제