런타임에 주입되는 ctor에서 여러 매개 변수를 사용하는 컨트롤러 클래스가 있습니다.TDD, 조롱, 의존성 주입 및 DRY 원칙
예 :
public ProductController(IProductRepositort productRepository,
IShippingService shippingService, IEmailProvider emailProvider)
{
...
}
나는 시험 방법이 거대한지고 있음을 발견하고있다.
[Test]
public void CanSendProduct()
{
//Code to set up stub
List<Product> products = new List<Product>();
for (int i = 0; i < length; i++)
{
products.Add(new Product()));
}
var mockProductRepository = new Mock<IProductRepository>();
mockProductRepository.Setup(x => x.GetProducts()).Returns(products);
//Code to set up stub
....
....
var mockShippingService = new Mock<IShippingService>();
mockShippingService.Setup(x => x.GetShippers()).Returns(shippers);
//Code to set up stub
.....
.....
var mockEmailProvider = new Mock<IEmailProvider>();
mockEmailProvider.Setup(x => x.Send()).Returns(provider);
//Execute Test
....
....
//Assert
....
....
}
물론, 그것은 실용적이지이 테스트 클래스의 모든 메소드에 모의 설치를 반복 다음과 같이 나는 방법을 설정하고있다.
내가 할 수있는 풍부한 mocking 개체를 만들려면 어떻게해야합니까? 동작 테스트의 확인과 동시에 설치의 고통을 최소화 하시겠습니까?
이 문제를 해결하기위한 TDD 모범 사례는 무엇입니까?
감사합니다.
+1. 또한 복잡한 테스트는 흔히 단일 클래스가 너무 많이하고 있음을 나타내는 기호입니다. 특히 "컨트롤러"와 같은 이름이 "관리자"와 비슷합니다. Inversion of Control 원리를 찾아보십시오. 또한 각 논리적 동작에 객체에 대한 단일 호출을 만들어 봅니다. 따라서 Add를 여러 번 호출하는 대신 하나의 목록을 가져올 수 있습니다. – kyoryu