수색…


비고

테스트 할 때 테스트 이중 시스템을 사용하여 테스트중인 시스템의 동작을 조작하거나 확인하는 것이 유용 할 때도 있습니다. 복식은 프로덕션 코드의 인스턴스 대신 테스트 대상 클래스 또는 메서드에 전달되거나 주입 됩니다.

스텁을 사용하여 미리 준비된 응답 제공

스텁은 메소드가 호출 될 때 미리 준비된 응답을 제공하는 경량 테스트 더블입니다. 테스트중인 클래스가 인터페이스 또는 기본 클래스에 의존하는 경우 인터페이스에 맞는 테스트를 위해 대체 '스텁'클래스를 구현할 수 있습니다.

따라서 다음 인터페이스를 가정하면,

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"));


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow