2016-06-16 1 views
-1

단위 테스트에는 응용 프로그램의 최소 단위 테스트가 포함됩니다. 따라서 GetAllUsers() 메서드를 테스트하기 위해 UserRepository에 대해 단위 테스트를 작성할 수 있습니다.단위 테스트는 어느 시점에서 통합 테스트가됩니까?

UserDomain에 대해 단위 테스트를 작성하여 GetAllUsers() 메서드를 테스트 할 수도 있습니다. UserDomain이 UserRepository로 호출하기 때문에 UserDomain 테스트는 통합 테스트로 간주됩니까?

또는 백엔드에 API를 제공하는 서비스 계층이있는 경우 UserDomain 테스트를 단위 테스트로 간주합니까?

+0

두 개 이상의 단위가 포함 된 통합 테스트입니다. – jonrsharpe

+0

경험에 비추어 볼 때 도메인 계층에서 단위 테스트를 만들고 서비스 계층에서 통합 테스트를 수행하는 많은 개발자가 있습니까? 기본적으로 반품 감소로 인해 Repo 레이어에서 단위 테스트를 건너 뛸 수 있습니까? – user6411982

+0

코드 내부의 로직을 테스트하는 유닛에 중점을 둡니다. 데이터 액세스 계층은 아마도 통합 테스트를 통해 데이터 액세스 레이어를 공격 할만큼 가볍습니다. –

답변

0

UserRepository에 의존하는 UserDomain을 테스트하는 경우 인터페이스에 코딩하는 것이 아니라 구체화/구현합니다. 이것은 두 사람을 차례로 연결합니다. 결합 된 코드는 단위 테스트 코드가 어렵다는 것을 의미합니다. UserDomainUserRepository이 없기 때문에 테스트 코드가 없습니다. 이 UserRepository에 의존로

public class UserDomain 
{ 
    public object GetAllUsers() 
    { 
     UserRepository repo = new UserRepository(); 
     var results = repo.GetAllUsers(); 
     // do some stuff like transforming it 
     return null; 
    } 
} 

public class UserRepository 
{ 
    public object GetAllUsers() 
    { 
     return null; // implementation 
    } 
} 

이 접근 방식의 코딩 문제는 당신이 정말로 "단위 테스트"UserDomain, 수 없다 : 당신의 예에서

, 당신은 아마 이런 일이있다. 실제 단위 테스트를 수행하려면 구현물에 의존하지 말고 인터페이스와 같은 추상적 개념을 사용해야합니다.

는 단위 테스트를 수행하기 위해, 수업은 더 같이 볼 수 있습니다 :

public class UserDomain 
{ 
    private readonly IUserRepository _iUserRepository; 

    public UserDomain(IUserRepository iUserRepository) 
    { 
     _iUserRepository = iUserRepository; 
    } 

    public object GetAllUsers() 
    { 
     var results = _iUserRepository.GetAllUsers(); 
     // do some stuff like transforming it 
     return null; 
    } 
} 

public interface IUserRepository 
{ 
    object GetAllUsers(); 
} 

public class UserRepository : IUserRepository 
{ 
    public object GetAllUsers() 
    { 
     return null; 
    } 
} 

참고하지 훨씬 정말 여기 변경 당신은 당신이보고있는 것을 이해하면. UserRepository이 구현하는 새 인터페이스 IUserRepository을 만들었습니다. UserDomain도 새로 구현 된 특정 구현 (UserRepository)보다는 IUserRepository의 인스턴스로 업데이트되었습니다.

이 몇 가지를 의미 UserDomain은 스텁 또는 테스트를 위해 테스트 기능을 제공하기 위해 밖으로 위조, 지금 쉽게 조롱 할 수있는 추상화 IUserRepository에 의존, 더 이상 UserRepository에 직접 의존하지 않습니다.

생성자에서 인터페이스의 구현을 전달하는 개념을 dependency injection이라고합니다. 생성자 삽입은 종속성 주입을 수행하는 한 방법이지만 다른 것들도 있습니다. 클래스의 기본 개념은 클래스가 종속성을 가지고 있고 종속성이 인터페이스/계약서에 있어야하며 실제 구현이 아니어야합니다. 말했다 모두와 함께

는, 통합 테스트 오히려 조롱하여 스텁,보다 UserDomain의 범위 내에서 UserRepository 같은 실제 구현을 사용하는 시험이다, IUserRepository를 위조.