2009-12-17 3 views
2

이 조롱 거리에 새로운 것이 있습니다. 몇 가지 질문이 있습니다.RhinoMock 또는 Moq를 사용하여 메소드의 내부 테스트

내가 틀렸다면 나를 바로 잡습니다. 실물 크기의 모의는 실제 방법을 초기화하지 않습니다. 즉, 모의은 실제로 클래스의 생성자를 호출하지 않습니다. 대신 클래스의 시그니처를 살펴보고 해당 시그니처가있는 메소드를 작성하지 않고 메소드를 작성하는 것과 같은 작업을 수행합니다. 이는 해당 유형의 객체 만 필요하지만 내부 객체를 테스트하지 않으려는 경우에 유용합니다. 만약 당신이 실제로 테스트하고있는 객체가 그것에 종속되어 있다면.

메서드의 내부를 테스트하려고합니다. 메서드가 속한 클래스의 인스턴스를 만들어야한다는 뜻입니까?

+1

당신이하고있는 일의 코드 샘플과 달성하고자하는 것이 도움이 될 것입니다. – roundcrisis

답변

7

요약 : 동적 인 가짜는 유형의 내부 테스트에 도움이되지 않지만 처음부터 시도해서는 안됩니다.


기본적으로 설명에는 정확하지만 다소 복잡합니다. 본질적으로 역동적 인 모의어 는 당신이 수작업으로 할 수 없었던 어떤 것도하지 않습니다..

: 수동 항상 입력 매개 변수를 무시하고 IMyInterface의 테스트 고유의 구현을 만들 수

public interface IMyInterface 
{ 
    string Foo(string s); 
} 

같은 결과를 반환

의 당신이 같은 일이 같은 인터페이스에 프로그래밍되어 있다고 가정 해 봅시다

public class MyClass : IMyInterface 
{ 
    public string Foo(string s) 
    { 
     return "Bar"; 
    } 
} 

그러나 소비자가 다른 반환 값에 어떻게 반응하는지 테스트하려면 반복적으로 빠르게됩니다. 테스트 더블을 손으로 코딩하는 대신, 프레임 워크가 동적으로 생성합니다.

동적 모의는 실제로 MyClass 구현과 비슷한 코드를 작성한다고 상상해보십시오 (실제로 코드를 작성하지는 않지만 동적으로 유형을 출력하지만 충분히 정확한 비유입니다). 여기

는 MOQ와 MyClass에 동일한 동작을 정의 할 수 있습니다 방법은 다음과 같습니다 객체가 생성 될 때 두 경우 모두

var mock = new Mock<IMyInterface>(); 
mock.Setup(x => x.Foo(It.IsAny<string>())).Returns("Bar"); 

가 생성 된 클래스의 construcor가 호출됩니다. 인터페이스에는 생성자가 없기 때문에 일반적으로 기본 생성자 (각각 MyClass 및 동적으로 생성되는 클래스)가됩니다.

당신과 같은 구체적인 유형과 동일한 기능을 수행 할 수 있습니다

이 하나

public class MyBase 
{ 
    public virtual string Ploeh() 
    { 
     return "Fnaah"; 
    } 
} 

손, 당신은 MyBase에서 파생하고 가상이기 때문에 Ploeh 메소드를 오버라이드 (override) 할 수있을 것입니다 :

public class TestSpecificChild : MyBase 
{ 
    public override string Ploeh() 
    { 
     return "Ndøh"; 
    } 
} 

동적 모의 라이브러리는 동일한 작업을 수행 할 수 있으며 추상 메소드의 경우에도 마찬가지입니다. 이 경우 기본 클래스의 생성자 이 호출됩니다. 그 이유는 .NET이 작동하기 때문입니다.

그러나 가상 또는 내부 구성원을 무시하는 코드는 작성할 수 없으며 동적 모의도 수행 할 수 없습니다.그들은 당신이 할 수있는 것을 손으로 만 할 수 있습니다.

조언 : 공용 API을 통해 유닛 테스트 내부 멤버 만 테스트합니다.

경고 : 위의 설명은 TypeMock을 제외한 대부분의 동적 모의물에 적용됩니다.