Поиск…


замечания

При тестировании иногда полезно использовать двойной тест для управления или проверки поведения тестируемой системы. Дублисты передаются или вводятся в тестируемый класс или метод вместо экземпляров производственного кода.

Использование заглушки для подачи консервированных ответов

Штук - это двойной тест с легким весом, который предоставляет консервированные ответы при вызове методов. В тех случаях, когда тестируемый класс использует интерфейс или базовый класс, альтернативный класс «заглушка» может быть реализован для тестирования, который соответствует интерфейсу.

Итак, предполагая следующий интерфейс,

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 часто могут смущаться. Одной из причин этого является то, что многие издевательские рамки также обеспечивают поддержку для создания Stubs без этапа проверки, связанного с 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);

Использование фальшивой структуры для проверки поведения

Mocks используются, когда необходимо проверить взаимодействие между тестируемой системой и тестовыми двойниками. Необходимо проявлять осторожность, чтобы не создавать слишком хрупкие тесты, но издевательство может быть особенно полезно, когда метод тестирования просто организует другие вызовы.

Этот тест проверяет , что , когда метод испытуемый называется ( ProcessRecord ), что метод обслуживания ( UseValue ) вызывается для Record , где 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);

Затем макет может быть опрошен, чтобы проверить, что к нему был приложен ожидаемый вызов. В этом случае вызов UseValue с одним параметром «Second», который является значением из записи, где 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