0

IoC 및 DI와 결합 된 MVC를 배우려고하는 임. 내 프로젝트에서 나는 또한 Castle, Automapper, NHibernate, NHibernateIntegration을 사용한다.단위 테스팅 MVC 컨트롤러

Kozmic의 우수 사례 "ToBeSeen"덕분에 나는 솔루션을 지금 거의 갖추고 있다고 생각합니다. 하지만 이제 컨트롤러 메서드 수준에서 기본 저장 작업을 단위 테스트하고 싶습니다. 나는 이것에 대해 어떻게 생각하는지 모르겠다. 내 문제는 꽤 간단하지만 Im과 초보자가이 도움을 주시면 감사하겠습니다.

[Authorize] 
    [Transactional] 
    public class DossierController : BaseController 
    { 
     private readonly IRepository repository; 
     private readonly IMappingEngine mappingEngine; 
     private readonly ILogger logger; 

     public DossierController(IRepository repository, IMappingEngine mappingEngine, ILogger logger) 
     { 
      this.repository = repository; 
      this.mappingEngine = mappingEngine; 
      this.logger = logger; 
     } 

당신이이 repostitory, mappingengine 및 로거를 필요 볼 수 있듯이 :

나는 이런 dossiercontroller 있습니다. 내가 알기 로이 모든 구성 및 런타임에 유선.

 [HttpPost] 
     [ActionName("Dossier")] 
     [Transaction] 
     [AcceptVerbs(HttpVerbs.Post)] 
     [AcceptParameter(Name = "button", Value = "save")] 
     public ActionResult Dossier_Save(string button, DossierModel dossierModel, string returnUrl) 
     { 
      if (!Request.IsAuthenticated) 
       return RedirectToAction("Index", "Home"); 

      if (!ModelState.IsValid) return View(dossierModel); 

      Dossier dossier = mappingEngine.Map<DossierModel, Dossier>(dossierModel); 

      repository.Save(dossier); 

      return View(); 
     } 

여기 난 그냥 서류에 dossiermodel을 오토와 저장소를 사용하여 저장할 :

다음 나는 서류를 저장하는 데 사용되는 제어 방법이있다.

이제 Nunit을 사용하여 단위 테스트를 수행하고 싶습니다. 나는 아무것도 모의하고 싶지 않다, 나는 컨트롤러 수준에서 진정한 지속성 테스트를 원한다. 이를 위해 새로운 책임자 컨트롤러를 만들고 올바른 인수를 전달해야합니다. 지금 나는 잃었다. 웹 응용 프로그램과 똑같이 작동하도록 인수를 만들고 구성하는 방법은 무엇입니까? 예를 들면 : Unittest에 Automapper를 올바르게 구성하려면 어떻게해야합니까? 올바르게 구성된 저장소를 작성하려면 어떻게해야합니까? 컨테이너를 사용해야합니까?

도움이 필요하시면 코드 예제를 제공해 주시면 대단히 감사하겠습니다.

미리 감사드립니다.

답변

0

모의하고 싶지 않은 경우 컨트롤러의 생성자에 필요한 구체적인 버전의 서비스를 인스턴스화해야합니다.

IRepository repository = GetRepository(); 
IMappingEngine mappingEngine = GetMappingEngine(); 
ILogger logger = GetLogger(); 
DossierController controller = new DossierController(repository, mappingEngine, logger); 
ActionResult rsult = controller.Save(...etc...); 

을 구성하고 이러한 인스턴스를 어떻게에 관해서는, 당신은 기본적으로 당신의 MVC 응용 프로그램이 일을 정확히 같은 방식으로이 작업을 수행해야합니다.

MVC 응용 프로그램에서 구성되는 위치가 확실하지 않은 경우 먼저 IoC 구성에서 보려는 첫 번째 위치를 제안합니다.

+0

감사! Im new 이것에, 당신은 pls 조롱의 예가 있습니까? 친절한 점, Hein – Hein73

+0

조롱은 기본적으로 인터페이스의 가짜 인스턴스를 설정하고 미리 준비된 응답을 반환하도록 설정한다는 의미입니다. Rhino Mock을 사용하여 모킹 서비스를위한 라이브러리를 사용해야합니다. 비록 Moq이 대중적이라는 것을 알고 있지만. 기본적인 예를 보려면 [link] (http://hibernatingrhinos.com/open-source/rhino-mocks)를보십시오. – StanK

+0

그래서 내가 제대로 이해한다면 모의는 실제 데이터베이스에 액세스하지 못한다는 것을 의미합니다. 그런데 컨트롤러를 테스트 할 때 컨트롤러를 어떻게 테스트 할 수 있습니까? 또는 컨트롤러에서 실제 Save 메서드를 호출하지 않아야합니까? 이제 저는 컨트롤러에서 repository.save를 직접 호출합니다. 똑똑한가? 안 그래요? – Hein73