2012-05-16 4 views
3

테스트중인 메소드가 있습니다.인스턴스화 된 객체를 mock.Expect() 호출 객체로 덮어 씁니다.

void MethodIAmTesting() 
{ 
    SomeObject so = new SomeObject(); 

    _someService.AnotherMethodCall(so); 
} 

이제는 단위 테스트에서 "너무"조롱하려고합니다.

그러나 테스트를 실행할 때 실제 메소드에서 인스턴스화 된 빈 버전을 사용합니다. 실제 코드 대신에 testSO를 사용하는 방법은 어떻게 얻을 수 있습니까? 아니면 불가능한가요?

감사합니다.

답변

0

테스트 주도 개발은 의존성 주입을 유도해야하는 설계의 일부입니다. 종종 단위 테스트가 어려운 것을 발견하면 설계를 재고해야하기 때문입니다.

이 경우, 시험 대상은 아마도 SomeObject을 만드는 데 합리적이어야합니다. 대신 누군가에게 제공되어야합니다. 아마도 테스트하는 클래스가 처음 인스턴스화 될 때 제공되어야 할 것이고 아마도 메소드를 호출 할 때 제공되어야 할 것입니다. 예 :

public class ClassBeingTested 
{  
    public ClassBeingTested(SomeObject so) 
    { 
    // Inject class dependency when instantiated the class 
    } 

    void MethodIAmTesting(SomeObject so) 
    { 
    // Passing things needed for a function to complete its work 
    } 
} 

또한 SomeObject의 인터페이스를 만들고 싶을 것입니다. 그런 다음 스텁을 만들어 쉽게 호출 할 수 있는지, 스텁 동작/속성 등을 테스트 할 수 있습니다. 이렇게하면 테스트하는 것이 훨씬 쉬워집니다. 예를 들어, 당신이 _someServiceSomeObject이 제공되고 있는지 확인하기 위해 테스트를 작성하는 방법을 살펴 보자 : 그것은

void EnsureSomeObjectPassedToService() 
{ 
    // arrange 
    SomeObject so = new SomeObject() 
    // act 
    _mainClass.MethodIAmTesting(so); 
    // assert 
    _someObject.AssertWasCalled(x => x.AnotherMethodCall(so)); 
} 

의 그! 일을 제대로 할 때 매우 쉽습니다.

관련 문제