UserRepository
에 의존하는 UserDomain
을 테스트하는 경우 인터페이스에 코딩하는 것이 아니라 구체화/구현합니다. 이것은 두 사람을 차례로 연결합니다. 결합 된 코드는 단위 테스트 코드가 어렵다는 것을 의미합니다. UserDomain
에 UserRepository
이 없기 때문에 테스트 코드가 없습니다. 이 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
를 위조.
두 개 이상의 단위가 포함 된 통합 테스트입니다. – jonrsharpe
경험에 비추어 볼 때 도메인 계층에서 단위 테스트를 만들고 서비스 계층에서 통합 테스트를 수행하는 많은 개발자가 있습니까? 기본적으로 반품 감소로 인해 Repo 레이어에서 단위 테스트를 건너 뛸 수 있습니까? – user6411982
코드 내부의 로직을 테스트하는 유닛에 중점을 둡니다. 데이터 액세스 계층은 아마도 통합 테스트를 통해 데이터 액세스 레이어를 공격 할만큼 가볍습니다. –