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