2014-01-23 1 views
0

내가 가지고있는 경우 controller 않는이 :MVC 컨트롤러에 mocking을위한 매개 변수화 된 생성자가 필요합니까?

//MyController 

public ActionResult MyMethod(string someString) 
{ 
    object test = new object(); 
    (new MyClassA()).DoSomething(test); 
    return View(); 
} 

나는 그것을 MyClassA의 조롱 버전을 통과 할 수 있도록 내가이 컨트롤러에 대한 constructor를 작성해야합니까?

//Test 

Mock<IMyClassA> a = new Mock<IMyClassA>(); 
a.Setup(m => m.DoSomething(new object()); 
MyController controller = new MyController(a.Object); 
+0

을 예, 당신이 당신의 컨트롤러에 대한 기본 생성자가 없다면. – Jason

+0

테스트를 위해 추가 생성자를 만들어야합니다. 그 나쁜 연습인가? – 4thSpace

+0

컨트롤러 테스트를 작성하든하지 않든 관계없이 두 번째 방법 (생성자를 사용하는 종속성 삽입과 함께 IoC)을 수행해야한다고 말하는 사람들이 있습니다. –

답변

1

예, 따라서 일반적으로는 생성자를 통해 특정 컨트롤러에서 사용이 컨트롤러의 private 필드에 할당하고자하는 모든 서비스 (클래스)에 대한 참조를 전달하는 것이 좋습니다. 그런 다음 특정 액션을 호출 할 때이 액션 본문에 특정 클래스를 인스턴스화 할 필요가 없습니다. 또한 테스트/모의 작업을 훨씬 쉽게 할 수 있습니다.

Inversion of Control (Dependency Injection) 패턴을 사용하여 실제 구현을 전달하는 대신 컨트롤러의 생성자에서 이러한 클래스의 인터페이스를 전달할 수 있습니다.

그래서 컨트롤러는 다음과 같이 수 :

public class SomeController : Controller 
{ 
    private readonly ISomeService _someService; 

    public SomeController(ISomeService someService) 
    { 
     _someService = someService; 
    } 

    public ActionResult Index() 
    { 
     return View(_someService.GetSomeModel()); 
    } 
} 
관련 문제