Как внедрить подделку, не нарушая тестируемый код ⇐ C#
Как внедрить подделку, не нарушая тестируемый код
ниже приводится оригинальный текст книги 《Искусство модульного тестирования, второе издание》: Извлечение интерфейса, позволяющего заменить базовую реализацию
[*]В этом методе вам нужно расшифровать код, который касается файловую систему в отдельный класс. Таким образом, вы можете легко отличить его, а затем замените вызов этого класса из ваших тестов (как было показано на рисунке 3.3). В этом первом списке показаны места, где вы нужно изменить код.
Листинг 3.1. Извлечение класса, работающего с файловой системой, и его вызов
public bool IsValidLogFileName (строковое имя файла) { FileExtensionManager мгр = новый FileExtensionManager(); вернуть mgr.IsValid(имя_файла); } класс FileExtensionManager { public bool IsValid (строковое имя файла) { //читаем здесь какой-то файл } } [*]Далее вы можете сообщить тестируемому классу, что вместо использования конкретного класса FileExtensionManager, он будет иметь дело с той или иной формой ExtensionManager, не зная его конкретной реализации. В .NET это можно сделать либо с помощью базового класса, либо с помощью интерфейс, который FileExtensionManager будет расширять. Следующий листинг показывает использование нового интерфейса в вашем дизайне, чтобы сделать его более проверяемый. На рис. 3.4 показана диаграмма этой реализации. Листинг 3.2. Извлечение интерфейса из известного класса
публичный класс FileExtensionManager: IExtensionManager { public bool IsValid (строковое имя файла) { //читаем здесь какой-то файл } } общедоступный интерфейс IExtensionManager { bool IsValid (строка имя_файла); } //тестируемая единица работы: public bool IsValidLogFileName (строковое имя файла) { IExtensionManager мгр = новый FileExtensionManager(); вернуть mgr.IsValid(имя_файла); } Обратите внимание, что 'IExtensionManager mgr = new FileExtensionManager();' в методе IsValidLogFileName впоследствии вызывает проблемы.
Листинг 3.4. Внедрение заглушки с помощью внедрения конструктора
публичный класс LogAnalyzer { частный менеджер IExtensionManager; общедоступный LogAnalyzer (директор IExtensionManager) { менеджер = менеджер; } public bool IsValidLogFileName (строковое имя файла) { вернуть менеджер.IsValid(имя_файла); //Тестируемый код был нарушен; 'IExtensionManager mgr = новый FileExtensionManager();' был удален!!!!! } } общедоступный интерфейс IExtensionManager { bool IsValid (строковое имя файла); } [ТестФикстура] общедоступный класс LogAnalyzerTests { [Тест] общественная пустота IsValidFileName_NameSupportedExtension_ReturnsTrue() { FakeExtensionManager myFakeManager = новый FakeExtensionManager(); myFakeManager.WillBeValid = правда; Журнал LogAnalyzer = новый LogAnalyzer (myFakeManager); bool result = log.IsValidLogFileName("short.ext"); Assert.True(результат); } } внутренний класс FakeExtensionManager: IExtensionManager { public bool WillBeValid = false; public bool IsValid (строковое имя файла) { вернуть WillBeValid; } } Обратите внимание на приведенный выше метод IsValidLogFileName. Хотя изменения позволяют тестовому коду работать правильно, работа тестируемого кода была нарушена; 'IExtensionManager mgr = новый FileExtensionManager();' было удалено.
Это нарушает целостность функциональности исходного кода. Когда мы запускаем исходный код в обычном режиме, программа не сможет правильно вызвать метод IsValid класса FileExtensionManager! Вы не получите тот же результат, что показан в листинге 3.2. Если я хочу восстановить исходный код, где мне следует разместить IExtensionManager mgr = new FileExtensionManager();' в строке 3.4?Чтобы код вызывал метод IsValid класса FileExtensionManager во время выполнения и метод IsValid класса FakeExtensionManager во время тестирования
ниже приводится оригинальный текст книги 《Искусство модульного тестирования, второе издание》: Извлечение интерфейса, позволяющего заменить базовую реализацию
[*]В этом методе вам нужно расшифровать код, который касается файловую систему в отдельный класс. Таким образом, вы можете легко отличить его, а затем замените вызов этого класса из ваших тестов (как было показано на рисунке 3.3). В этом первом списке показаны места, где вы нужно изменить код.
Листинг 3.1. Извлечение класса, работающего с файловой системой, и его вызов
public bool IsValidLogFileName (строковое имя файла) { FileExtensionManager мгр = новый FileExtensionManager(); вернуть mgr.IsValid(имя_файла); } класс FileExtensionManager { public bool IsValid (строковое имя файла) { //читаем здесь какой-то файл } } [*]Далее вы можете сообщить тестируемому классу, что вместо использования конкретного класса FileExtensionManager, он будет иметь дело с той или иной формой ExtensionManager, не зная его конкретной реализации. В .NET это можно сделать либо с помощью базового класса, либо с помощью интерфейс, который FileExtensionManager будет расширять. Следующий листинг показывает использование нового интерфейса в вашем дизайне, чтобы сделать его более проверяемый. На рис. 3.4 показана диаграмма этой реализации. Листинг 3.2. Извлечение интерфейса из известного класса
публичный класс FileExtensionManager: IExtensionManager { public bool IsValid (строковое имя файла) { //читаем здесь какой-то файл } } общедоступный интерфейс IExtensionManager { bool IsValid (строка имя_файла); } //тестируемая единица работы: public bool IsValidLogFileName (строковое имя файла) { IExtensionManager мгр = новый FileExtensionManager(); вернуть mgr.IsValid(имя_файла); } Обратите внимание, что 'IExtensionManager mgr = new FileExtensionManager();' в методе IsValidLogFileName впоследствии вызывает проблемы.
Листинг 3.4. Внедрение заглушки с помощью внедрения конструктора
публичный класс LogAnalyzer { частный менеджер IExtensionManager; общедоступный LogAnalyzer (директор IExtensionManager) { менеджер = менеджер; } public bool IsValidLogFileName (строковое имя файла) { вернуть менеджер.IsValid(имя_файла); //Тестируемый код был нарушен; 'IExtensionManager mgr = новый FileExtensionManager();' был удален!!!!! } } общедоступный интерфейс IExtensionManager { bool IsValid (строковое имя файла); } [ТестФикстура] общедоступный класс LogAnalyzerTests { [Тест] общественная пустота IsValidFileName_NameSupportedExtension_ReturnsTrue() { FakeExtensionManager myFakeManager = новый FakeExtensionManager(); myFakeManager.WillBeValid = правда; Журнал LogAnalyzer = новый LogAnalyzer (myFakeManager); bool result = log.IsValidLogFileName("short.ext"); Assert.True(результат); } } внутренний класс FakeExtensionManager: IExtensionManager { public bool WillBeValid = false; public bool IsValid (строковое имя файла) { вернуть WillBeValid; } } Обратите внимание на приведенный выше метод IsValidLogFileName. Хотя изменения позволяют тестовому коду работать правильно, работа тестируемого кода была нарушена; 'IExtensionManager mgr = новый FileExtensionManager();' было удалено.
Это нарушает целостность функциональности исходного кода. Когда мы запускаем исходный код в обычном режиме, программа не сможет правильно вызвать метод IsValid класса FileExtensionManager! Вы не получите тот же результат, что показан в листинге 3.2. Если я хочу восстановить исходный код, где мне следует разместить IExtensionManager mgr = new FileExtensionManager();' в строке 3.4?Чтобы код вызывал метод IsValid класса FileExtensionManager во время выполнения и метод IsValid класса FakeExtensionManager во время тестирования
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу проверить, что тестируемый PHP-код вызывает правильный метод для признака?
Anonymous » » в форуме Php - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-