이 (단위) 테스트 방법이 맞습니까?
당신은 당신의 코드 (귀하의 예제에서 예를 들어 MyClass
)의 특정 장치를 테스트 할 수 있도록 의존성을 조롱하고 싶은 경우에, 당신은 다른 돌봐 서비스로 코드를 작성 볼 필요가 책임. FooClass
이 만들어되어야한다는 MyContainer
인스턴스를 제공하는 새로운 FooClass
만들기 새로운 MyContainer
만들기
- : 당신의 예에서 당신의
MyMethod
여러 가지 책임이 있습니다.
는
MyMethod
가에 특정
MyContainer
을 전달하는 테스트 당신의 욕망을 충족하려면
FooClass
새로운 클래스로 밖으로 책임 (1)과 (2)를 분리 할 수 있습니다. 일반적으로 C#에서는이 클래스에 인터페이스를 제공하고
MyClass
은 이러한 각 인터페이스를 종속성으로 사용합니다. 예 :
public interface IFooClassProvider
{
FooClass CreateFooClass(MyContainer container, int d, int e, int f);
}
public interface IMyContainerProvider
{
MyContainer CreateMyContainer(int a, int b, int c);
}
public MyClass
{
private IMyContainerProvider _myContainerProvider;
private IFooClassProvider _fooClassProvider;
public MyClass(IMyContainerProvider myContainerProvider, IFooClassProvider fooClassProvider)
{
_myContainerProvider = myContainerProvider;
_fooClassProvider = fooClassProvider;
}
...
public bool MyMethod(int a, int b, int c, out FooClass foo)
{
var someContainer = _myContainerProvider.CreateMyContainer(a,b,c);
foo = _fooClassProvider.CreateFooClass(someContainer,1,2,3);
...
return true;
}
...
}
인터페이스의 '실제'구현이 명확하게 이루어지기를 바랍니다. 테스트를 수행하기 위해 이러한 인터페이스 각각에 대한 모의 작업을 만들 수 있습니다 (예 : new Mock<IFooclassProvider>()
을 찾아 MyClass
의 생성자로 전달합니다. 유닛 테스트에서는 Setup
IMyContainerProvider
유닛 테스트에서 생성 한 특정 컨테이너 인스턴스를 제공자에게 조롱 할 수 있습니다. 그런 다음 IFooClassProvider
mock의 메소드가 특정 컨테이너와 함께 호출 된 Verify
을 사용할 수 있습니다.
예.
var mockFooClassProvider = new Mock<IFooClassProvider>();
var mockMyContainerProvider = new Mock<MyContainerProvider>();
var myKnownContainer = new MyContainer(...);
mockMyContainerProvider.Setup(m => m.CreateMyContainer(It.IsAny<int>, ...))
.Returns(myKnownContainer);
var myClass = new MyClass(mockMyContainerProvider.Object, mockFooClassProvider.Object);
FooClass fooClass;
myClass.MyMethod(..., out fooClass);
mockFooClassProvider.Verify(m => m.CreateFooClass(myKnownContainer, It.IsAny<int>(),...);
이 답변은 간단한 상황에 극단적으로 일을 가지고,하지만 난 문제의 예를 좀 더 복잡한 코드의 단순화 된 버전이었다 그림. 이러한 방식으로 책임을 분리하면 코드를 짧은 테스트 가능한 세그먼트로 신속하게 단순화 할 수 있습니다.