2017-12-19 3 views
1

예를 들어, 우리는 ShipmentInformationModelFactory를 가지고 있습니다. 모델을 채우고 그것을 반환하는 것이 목적입니다.TDD - 팩토리 논리의 구체적인 버전을 어떻게 구체적으로 구현할 수 있습니까?

internal class ShipmentInformationModelFactory 
{ 
    private IGetCarrierServiceFactory getCarrierServiceFactory; 

    public ShipmentInformationModelFactory(IGetCarrierServiceFactory getCarrierServiceFactory) 
    { 
     this.getCarrierServiceFactory = getCarrierServiceFactory; 
    } 


    internal ShipmentInformation Create(ICarrierTransaction carrierTransaction, CarrierPackage carrierPackage) 
    { 
     ShipmentInformation shipmentInformation = new ShipmentInformation(); 

     // Get the Carrier Service Model for the ID of the carrier service against the Package. 
     ICarrierServiceModel carrierServiceModel = this.getCarrierServiceFactory.Get(carrierPackage.CarrierServiceId); 

     shipmentInformation.ServiceCode = carrierServiceModel.Code; 

     return shipmentInformation; 
    } 
} 

다음으로 일부 스텁 데이터를 반환하는 MockGetCarrierServiceFactory가 있습니다.

[TestMethod] 
    public void CreateShipmentInformation_ShipmentData() 
    { 
     ShipmentInformationModelFactory shipmentInformationModelFactory = new ShipmentInformationModelFactory(new MockGetCarrierServiceFactory()); 

     ShipmentInformation shipmentInformation = shipmentInformationModelFactory.Create(); 
    } 

    internal class MockGetCarrierServiceFactory : IGetCarrierServiceFactory 
    { 
     public ICarrierServiceModel Get(int carrierServiceModelID) 
     { 
      ICarrierServiceModel carrierServiceModel = Mock.Create<ICarrierServiceModel>(); 

      Mock.Arrange(() => carrierServiceModel.Code).Returns("TestCarrier"); 

      Mock.Arrange(() => carrierServiceModel.Description).Returns("TestDescription"); 

      return carrierServiceModel; 
     } 
    } 

멋진 작품이며 솔리드 원리를 잘 따르고 있다고 느낍니다. 틀렸다면 언제든지 저를 고쳐주십시오.

내 문제는이 구현의 (실제) 구체적인 버전과 함께 제공됩니다. 어떤 시점에서 GetCarrierServiceFactory의 구체적인 버전을 ShipmentInformationModelFactory로 전달해야합니까?

기본 생성자를 생성하고 거기에 자동으로 채워지는 경로를 내려야합니까?

ShipmentInformationModelFactory 객체를 인스턴스화하는 클래스는 생성자에게 전달되면 전달할 수 있지만 방금 여기에 종속성을 만들었습니다.

TDD와 솔리드 원칙을 80 % 이해하고있는 것처럼 느껴지지만 이러한 공장을 만들면 길을 잃어 가고 있습니다.

답변

2

ShipmentInformationModelFactory 객체를 인스턴스화하는 클래스는 생성자에게 전달 될 수 있지만 여기에 종속성을 만들었습니다.

당신은 의존성이 있어야합니다. ShipmentInformationModelFactoryIGetCarrierServiceFactory의 구체적인 구현에 따라 다릅니다. 핵심은 커플 링이되는 종속성을 피하는 것입니다.

기본 생성자 경로를 사용하는 경우 해당 종속성을 ShipmentInformationModelFactory 내에 하드 코딩하여 두 개를 긴밀하게 연결합니다.

그래서 해결책은 응용 프로그램 시작시 종속성을 제공하는 것입니다. 코드의 시작점에서 IoC 컨테이너를 사용하여 이러한 종속성을 충족 시키거나 순수 DI (즉, 고유 한 매핑 코드 작성)를 사용하십시오.

그런 식으로 두 클래스는 느슨하게 결합 된 상태로 유지되며 테스트 방법은 여전히 ​​작동하지만 응용 프로그램 자체에서 실제 종속성을 철저히 조사 할 수도 있습니다.

+0

흥미 롭다면, 이전에는 IoC 컨테이너에 대해 들어 본 적이 없었습니다. 이 문제를 해결하는 가장 일반적인 방법은 IoC를 통하는 것입니까? – Eritey

관련 문제