unit-testing
테스트 복식
수색…
비고
테스트 할 때 테스트 이중 시스템을 사용하여 테스트중인 시스템의 동작을 조작하거나 확인하는 것이 유용 할 때도 있습니다. 복식은 프로덕션 코드의 인스턴스 대신 테스트 대상 클래스 또는 메서드에 전달되거나 주입 됩니다.
스텁을 사용하여 미리 준비된 응답 제공
스텁은 메소드가 호출 될 때 미리 준비된 응답을 제공하는 경량 테스트 더블입니다. 테스트중인 클래스가 인터페이스 또는 기본 클래스에 의존하는 경우 인터페이스에 맞는 테스트를 위해 대체 '스텁'클래스를 구현할 수 있습니다.
따라서 다음 인터페이스를 가정하면,
public interface IRecordProvider {
IEnumerable<Record> GetRecords();
}
다음 방법을 테스트해야하는 경우
public bool ProcessRecord(IRecordProvider provider)
인터페이스를 구현하는 스텁 클래스는 알려진 데이터를 테스트중인 메서드로 반환하도록 작성할 수 있습니다.
public class RecordProviderStub : IRecordProvider
{
public IEnumerable<Record> GetRecords()
{
return new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
};
}
}
이 스텁 구현은 테스트중인 시스템에 제공되어 동작에 영향을 줄 수 있습니다.
var stub = new RecordProviderStub();
var processed = sut.ProcessRecord(stub);
조롱 프레임 워크를 스텁으로 사용
모의 (Mock)와 스텁 (Stub)이라는 용어는 종종 혼란 스러울 수 있습니다. 그 이유 중 하나는 많은 mocking 프레임 워크가 Mocking과 관련된 검증 단계없이 스텁 생성을 지원한다는 것입니다.
"스텁을 사용하여 준비된 응답 제공"예제와 같이 스텁을 구현하는 새 클래스를 작성하는 대신 조롱 프레임 워크를 대신 사용할 수 있습니다.
Moq 사용 :
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
이렇게하면 손으로 코딩 된 스텁과 동일한 동작이 이루어지며 비슷한 방식으로 테스트중인 시스템에 제공 될 수 있습니다.
var processed = sut.ProcessRecord(stub.Object);
조롱 프레임 워크를 사용하여 동작 확인
Mock은 테스트중인 시스템과 테스트 복식 간의 상호 작용을 확인해야 할 때 사용됩니다. 지나치게 부서지기 쉬운 시험을 피하기 위해주의를 기울여야하지만 조롱은 테스트 할 방법이 단순히 다른 호출을 조정하는 경우에 특히 유용 할 수 있습니다.
이 테스트는 테스트중인 메소드가 호출 될 때 ( ProcessRecord
), Flag==true
Record
대해 서비스 메소드 ( UseValue
)가 호출 UseValue
Flag==true
. 이렇게하기 위해 통조림 데이터가있는 스텁을 설정합니다.
var stub = new Mock<IRecordProvider>();
stub.Setup(provider => provider.GetRecords()).Returns(new List<Record> {
new Record { Id = 1, Flag=false, Value="First" },
new Record { Id = 2, Flag=true, Value="Second" },
new Record { Id = 3, Flag=false, Value="Third" }
});
그런 다음 IService
인터페이스를 구현하는 모의 객체를 설정합니다.
var mockService = new Mock<IService>();
mockService.Setup(service => service.UseValue(It.IsAny<string>())).Returns(true);
그런 다음 이들은 테스트중인 시스템에 제공되며 테스트 할 메소드가 호출됩니다.
var sut = new SystemUnderTest(mockService.Object);
var processed = sut.ProcessRecord(stub.Object);
그런 다음 모의 (mock)을 조사하여 예상되는 전화가 걸려 왔는지 확인할 수 있습니다. 이 경우 Flag==true
레코드의 값인 "Second"매개 변수가있는 UseValue
대한 호출 Flag==true
.
mockService.Verify(service => service.UseValue("Second"));