이없는 종속성과 같은 인터페이스를 가지고해야하지만, 그 권장 널리 연습을 따라합니다.
종속성으로 인터페이스 및 기본 클래스를 사용하면 손실이 많은 커플 디자인을 만드는 데 도움이됩니다. 느슨하게 결합 된 디자인은 다른 레이어에 대한 구현 세부 사항에 의존하지 않고 모듈/애플리케이션 레이어를 생성 할 수 있습니다. 이렇게하면 다른 레이어가 작동하거나 반응하는 것을 걱정하지 않고도 코드 조각을 쉽게 테스트 할 수 있습니다. 이러한 유형의 테스트를 단위 테스트라고합니다.
콘크리트 클래스에 의존성이 있다면 단위 테스트 코드를 분리하여 사용할 수 없습니다. 이러한 테스트는 종속성 구현이 변경 될 때마다 실패하는 경향이 있습니다. 코드가 실제 파일 시스템 클래스 또는 실제 db에 연결되는 데이터 액세스 클래스에 종속되는 경우 파일에 액세스 할 수 없거나 db 서버가 다운되거나 데이터가 손상 될 때 단위 테스트가 실패 할 가능성이 있습니다.
단위 테스트라고는하지 않습니다. 이를 통합 테스트라고합니다.
앞서 언급 한 것처럼 별도로 코드를 테스트하는 동안 종속성이 어떻게 작동하는지 걱정할 필요가 없습니다. 그 이유는 단위 테스트 종속성을 조롱하는 동안. 또한 종속성은 인터페이스가 아니어야합니다. 기본 클래스가 될 수도 있습니다. 종속성을 조롱 할 때, mock은 기능을 실제로 구현하지 않습니다. mock을 만들 수있는 방법은 여러 가지가 있습니다.
단위 테스트에서 mocks를 사용하면 현재 클래스의 코드를 테스트하는 동안 기대 한대로 동작하는지 확인해야합니다. 따라서 모의 객체가 원하는 방식으로 동작하도록 요청하십시오. 모의 메소드 나 속성이 호출되었는지 확인하십시오. 그러면 테스트중인 코드 조각의 모든 경로를 처리 할 수 있습니다.
다음은 종속성이있는 단위 테스트의 간단한 예입니다.
public class ProductService
{
private IProductRepository repository;
public ProductService (IProductRepository repository)
{
this.repository = repository;
}
public Product GetProductById(int productId)
{
if(productId <= 0)
return null;
var product = this.repository.GetProductById(productId);
return product;
}
}
내가 IProductRepository 인터페이스의 실제 구현이없는 경우에도, ProductService 클래스를 생성하는 동안, 나는 여전히 다음과 같은 수 있습니다 단위 테스트 ProductService 클래스로.
public class ProductServiceTests
{
ProductService serviceToTest;
IProductRepository productRepository;
public ProductServiceTests()
{
this.productRepository = Mock<IProductRepository>();
this.serviceToTest = new ProductService(productRepository);
}
public void GetProductByIdReturnsNullIfProductIdIsZero()
{
int productid = 0;
var product = serviceToTest.GetProductById(productid);
Assert.That(product, Is.Null);
}
public void GetProductByIdReturnsNullIfProductIdIsNegative()
{
int productid = -1;
var product = serviceToTest.GetProductById(productid);
Assert.That(product, Is.Null);
}
public void GetProductByIdReturnsProductIfProductIdIsPositive()
{
var productid = 1;
var product = new Product { Id = productId };
productRepository.Setup(repo => repo.GetProductById(productid)).Returns(product); //Making sure that GetProductById method of repository is called and return an object of product as this call is part of the code which I am testing right now.
var product = serviceToTest.GetProductById(productid);
Assert.That(product, Is.Not.Null);
Assert.That(product.Id, Is.EqualTo<int>(productid));
}
}
이것은 단위 테스트를 설명하기위한 예제 코드입니다. 예상대로 빌드되거나 실행되지 않을 수 있으며 사과드립니다.
그런 다음 객체를 주입하십시오. 예,하지만 객체에 모의 주입 방법은 무엇입니까? 적어두고 얼마나 멀리 있는지보십시오. –
유닛 테스트를 호출 할 때, 나는 단순히 객체 (구체적인 구현체)를 만들고 그것을 전달할 것으로 기대한다. – user970696
@HenkHolterman 실제 인스턴스를 만드는 것은 "라이브", 종속성 등을 의미합니다. 인터페이스를 사용하여 필자가 필요로하는 응답을 조롱하며 자신의 동작을 정의합니다. – user970696