요약 : 동적 인 가짜는 유형의 내부 테스트에 도움이되지 않지만 처음부터 시도해서는 안됩니다.
기본적으로 설명에는 정확하지만 다소 복잡합니다. 본질적으로 역동적 인 모의어 는 당신이 수작업으로 할 수 없었던 어떤 것도하지 않습니다..
: 수동 항상 입력 매개 변수를 무시하고 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을 제외한 대부분의 동적 모의물에 적용됩니다.
당신이하고있는 일의 코드 샘플과 달성하고자하는 것이 도움이 될 것입니다. – roundcrisis