Как внедрить подделку, не нарушая тестируемый кодC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как внедрить подделку, не нарушая тестируемый код

Сообщение Anonymous »


ниже приводится оригинальный текст книги 《Искусство модульного тестирования, второе издание》: Извлечение интерфейса, позволяющего заменить базовую реализацию
[*]В этом методе вам нужно расшифровать код, который касается файловую систему в отдельный класс. Таким образом, вы можете легко отличить его, а затем замените вызов этого класса из ваших тестов (как было показано на рисунке 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 во время тестирования
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как я могу проверить, что тестируемый PHP-код вызывает правильный метод для признака?
    Anonymous » » в форуме Php
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous
  • Тестируемый модуль: Impl или интерфейс?
    Anonymous » » в форуме JAVA
    0 Ответы
    24 Просмотры
    Последнее сообщение Anonymous
  • Как написать чрезвычайно эффективный и тестируемый генератор GUID
    Anonymous » » в форуме C#
    0 Ответы
    15 Просмотры
    Последнее сообщение Anonymous
  • Как написать чрезвычайно эффективный и тестируемый генератор GUID
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous
  • Как настроить Capacitor, чтобы живая перезагрузка работала в разработке, не нарушая производственную сборку
    Гость » » в форуме IOS
    0 Ответы
    29 Просмотры
    Последнее сообщение Гость

Вернуться в «C#»