2016-06-10 3 views
1

테스트 구동 개발주기를 따르려면 먼저 테스트를 먼저 작성한 다음 코드를 작성해야합니다. 나는 다음과 같은 클래스가있는 경우 그러나, :지연 초기화를 수행하는 TDD 코드

public class ServiceProvider : IServiceProvider 
{ 
    private readonly IService1 service1; 
    private readonly IService2 service2; 
    ... 

    public ServiceProvider() 
    { 
     service1 = new Service1(); 
     service2 = new Service2(); 
     ... 
    } 

    public IService1 Service1 { get { return service1; } } 
    public IService2 Service2 { get { return service2; } } 
    ... 
} 

그냥 확인하는 테스트를 반환하는 경우는 null이 아님 :

[TestFixture] 
public class ServiceProviderTest 
{ 
    [Test] 
    public void ServicesAreNotNull() 
    { 
     var serviceProviderUT = new ServiceProvider(); 

     Assert.That(serviceProviderUT.Service1, Is.Not.Null); 
     Assert.That(serviceProviderUT.Service2, Is.Not.Null); 
     ... 
    } 
} 

전에서 가서 저를 강제로 테스트를 작성하는 방법 그 수업을 다음 학급으로?

public class ServiceProvider : IServiceProvider 
{ 
    private readonly Lazy<IService1> service1; 
    private readonly Lazy<IService2> service2; 
    ... 

    public ServiceProvider() 
    { 
     service1 = new Lazy<IService1>(() => new Service1()); 
     service2 = new Lazy<IService2>(() => new Service2()); 
     ... 
    } 

    public IService1 Service1 { get { return service1.Value; } } 
    public IService2 Service2 { get { return service2.Value; } } 
    ... 
} 

답변

2

테스트를 통해 특정 구현을 수행해서는 안됩니다. 그것은 특정 행동을 기대합니다. 단위 테스트의 경우 코드가 블랙 박스이고 동작이 올바른 경우 테스트가 성공합니다. 이 경우 서비스의 구현은 비공개이므로 테스트가 구현되는 방법에 대해 걱정할 필요가 없습니다. 클래스의 인터페이스가 변경되지 않으면 동일한 unittest가 있어야합니다. 게으른 초기화는 코드 검토 항목입니다.

+0

답장을 보내 주셔서 감사합니다.하지만 행동에 관해서 이야기하고 있으니 답변이 BDD가 아닌 BDD와 관련이 있는지 궁금합니다. TDD가 아니라면 (나는 여전히 그 차이점을 찾으려고합니다.) 변수가 느슨하게 초기화되었는지 여부를 테스트 할 필요가 없다는 말입니까? – Charlie

+0

글쎄, 어떤 경우에 ** 무언가가 게으른 경우 유효성을 검사 할 수도 있습니다. 예를 들어'yield return'이 사용되는지 확인하는 것입니다. –

+0

BDD가 다른 것입니다. BDD는 지정된 형식의 사양입니다. 감안할 때 ... 언제 ... 이상 ... 구현 세부 사항에 의존하고 싶지 않기 때문에 우리는 TDD에서 개인 물건을 테스트하지 않습니다. – ntohl