2013-05-06 4 views
0

저는 리포지토리 레이어, DTO 서비스 레이어 및 WebAPI 레이어가있는 webAPI 응용 프로그램이 있습니다. WebAPI는 DTO 호출 리포지토리를 호출합니다.WebAPI 컨트롤러를 테스트하는 방법은 무엇입니까?

public class RepositoryService : IRepositoryService 
    { 
     private readonly DbContext _db; 

     public RepositoryService(string connectionString) 
     { 
      _db = new DbContext(connectionString); 
     } 

     public RepositoryService() 
     { 
      _db = new DbContext(); 
     } 

을 그리고 내 DTO 서비스는 다음과 같이 시작 :

내 저장소는 다음과 같이 시작

public class DtoService : IDtoService 
    { 
     private readonly RepositoryService _repository; 

     public DtoService(string connectionString) 
     { 
      _repository = new RepositoryService(connectionString); 
     } 

     public DtoService() 
     { 
      _repository = new RepositoryService(); 
     } 

내 DbContext는 다음과 같습니다 : 지금까지

public DbContext() : base("name=TestConnection") 
     { 

     } 

public DbContext(string connectionString) : base(connectionString) 
     { 

     } 

이, 테스트를 위해 응용 프로그램을 실행할 때 사용할 연결 문자열을 선택적으로 정의하도록 허용했습니다.

첫 번째 질문 :이 방법이 괜찮은 것 같습니까?

이제 WebAPI 레이어가 생겼으므로 컨트롤러 클래스가 하나만있는 것은 아닙니다. 여러 컨트롤러가 있습니다. 각 컨트롤러에 대해 이러한 생성자를 검토하고 구현하는 방법에 대해 생각하고 있지만이 작업을 수행하는 더 좋은 방법이 있어야합니다. 뭔가 이것이 의존성 주사가 작용하는 곳이라고 알려주지 만 잘 모르겠습니다.

나는 이런 식으로 뭔가를 할 수 : 내 테스트에서

  • 위 내 서비스에 대해 가지고있는 것처럼

    1. 각 컨트롤러에 대한 생성자를 작성,

      VAR 등의 각 컨트롤러의 최대 새로운 인스턴스 accountController = new AccountController (connectionStringForTesting)

    실용적이지 않기 때문에 ...

    두 번째 질문 : 실용적인 접근 방식은 어떻게 생겼을까요?

  • 답변

    1

    단위 테스트에 관심이있는 경우 데이터베이스를 모방하는 것이 좋으므로 테스트에서 IO 나 데이터베이스에 의존하지 마십시오. 인터페이스 뒤에 DBContext을 숨기고 연결 문자열을 전달하는 대신 요청의 콜백을 모의하기 위해 모든 조롱 프레임 워크 (예 : Moq)를 사용할 수 있습니다.

    통합 테스트에 관심이 있다면 별도의 데이터베이스 만 필요하며 모든 코드는 동일하게 유지 될 수 있습니다.

    0

    클래스를 멋지게 테스트 할 수있게하려면 클래스의 각 클래스를 개별적으로 테스트 할 수 있도록 모든 종속성을 주입하는 것이 좋습니다.

    아래의 시도에서 - 원하는 컨테이너의 종속성을 연결해야하므로 상자가 작동하지 않으며 설정은 가져 오는 위치에 따라 다를 수 있습니다 그러나 나는 당신이 아이디어를 얻길 바랍니다.

    public DbContext(IConfig config) : base(config.ConnectionString) 
    { 
    } 
    
    public interface IConfig 
    { 
        string ConnectionString {get;} 
    } 
    
    public class RepositoryService : IRepositoryService 
    { 
        private readonly DbContext _dbContext; 
    
        public RepositoryService(IDbContext dbContext) 
        { 
         _dbContext = dbContext; 
        } 
    } 
    
    public class DtoService : IDtoService 
        { 
         private readonly RepositoryService _repository; 
    
         public DtoService(IRepositoryService repository) 
         { 
         } 
    } 
    

    이 모든 작업을 완료하면 Dima - in Rhino에서 제안한대로 조롱 프레임 워크를 사용하게됩니다.이 라인을 따라 뭔가를 가보십시오.

    var config = MockRepository.GenerateStub<IConfig>(); 
    config.Stub(c => c.ConnectionString).Return("yourConnectionString"); 
    
    var dbContext = MockRepository<IDbContext>(); 
    
    var controller = new YourController([mockDependency1], [mockDependency2]); 
    
    controller.[YourMethod](); 
    _dbContext.AssertWasCalled(dc => dc.[theMEthodYouExpectToHaveBeenCalled]) 
    
    관련 문제