2010-06-14 7 views
3

생성자를 호출하는 코드를 테스트 할 때 실제 인스턴스 대신 모의 객체를 만들 수있는 방법이 있습니까? 예를 들어단위 테스트에서 모의 ​​구조 만들기

:

public class ClassToTest 
{ 
    public void MethodToTest() 
    { 
    MyObject foo = new MyObject(); 
    Console.WriteLine(foo.ToString()); 
    } 
} 

이 예에서, I는 ClassToTest 인스턴스에 MethodToTest 호출 것 실제로 출력간에 a의 toString() 메소드의 결과 새롭게 확인 유닛 테스트를 만들어야 MyObject의 인스턴스를 생성했습니다.

'ClassToTest'클래스를 실제로 테스트하는 방법을 볼 수 없습니다. 이 메서드를 테스트하면 실제로 'myObject.ToString()'메서드뿐만 아니라 MethodToTest 메서드도 테스트됩니다.

답변

3

아니요. ClassToTest은 디자인 상으로는 테스트하기가 어렵습니다. mock 객체에 대한 의존성을 바꿀 수 있기를 원한다면, 이러한 의존성이 어떻게 주입되는지 생각할 필요가있다. 그러나 생성자에서 생성하는 것은 당신을 도울 방법이 아니다. 당신은 생성자 주입 사용할 수 있습니다

public class ClassToTest 
{ 
    MyObject _foo; 
    public void MethodToTest(Myobject foo) 
    { 
    _foo = foo; 
    Console.WriteLine(foo.ToString()); 
    } 
} 

를하거나 재산 주입을 사용할 수

public class ClassToTest 
{ 
    public MyObject Foo { get; set; } 
    public void MethodToTest() 
    { 
    } 
} 

더이 콘솔을 작성하려면 주어진 당신의 예에 맞게 할 수 있습니다 전자; 종속성이 선택적 객체가 아닌 객체에 대한 의존성을 가져야하는 경우가 가장 좋은 방법입니다.

dependency injectioninversion of control의 개념을 탐색하는 것보다 훨씬 많은 작업을 수행 할 수 있습니다.

+0

콘솔에서 정적 메서드 WriteLine을 사용하는 것과 비슷한 문제가 있습니다. 이것은 테스트하기 어려울 것입니다. 개인적으로 콘솔과 같은 BCL 클래스를 인스턴스 메소드 WriteLine이있는 클래스로 마무리합니다. WriteLine 클래스는 실제 콘솔을 호출합니다. 그런 다음 테스트에서 조롱 된 래퍼를 삽입하고 이에 대해 주장합니다. –

+0

필자는 테스트에 관계없이 확실히 더 나은 옵션이라고 생각했지만 어떤 경우에는 클라이언트 코드가 'ClassToTest'에서 사용할 객체를 제공하는 것이 좋지 않을 수도 있습니다. '. 또한 ClassToTest에 필요한 데이터가 포함되어 있으면 클라이언트 코드가 적절한 인스턴스를 제공하지 못할 수도 있습니다. 나는 .NET의 클래스 레지스트리를 '오버라이드 (override)'하고 클래스의 구현을 제공 할 수 있기를 바랬다. – Flynn1179

관련 문제