Каковы преимущества упаковки системных объектов (File, ServiceController и т. Д.) С использованием шаблона Adapter по сравнению с обходом для модульного тестирования? - PullRequest
8 голосов
/ 09 февраля 2011

Рассмотрим следующий метод, который останавливает службу:

Public Function StopService(ByVal serviceName As String, ByVal timeoutMilliseconds As Double) As Boolean

    Try
        Dim service As New ServiceController(serviceName)
        Dim timeout As TimeSpan = TimeSpan.FromMilliseconds(timeoutMilliseconds)

        service.[Stop]()

        If timeoutMilliseconds <= 0 Then
            service.WaitForStatus(ServiceControllerStatus.Stopped)
        Else
            service.WaitForStatus(ServiceControllerStatus.Stopped, timeout)
        End If

        Return service.Status = ServiceControllerStatus.Stopped

    Catch ex As Win32Exception
        'error occured when accessing a system API'
        Return False
    Catch ex As TimeoutException
        Return False
    End Try

End Function

Чтобы выполнить модульное тестирование метода, у меня есть два варианта:

  1. Использование шаблона адаптера для переносаметоды класса ServiceController, которые мне нужны, в интерфейс, которым я могу управлять.Этот интерфейс затем может быть введен в класс обслуживания (иначе говоря, Inversion of Control).Таким образом, у меня есть слабосвязанный код, и я могу использовать традиционные тестовые среды для тестирования.
  2. Сохраняйте класс как есть и используйте Microsoft Moles (или любую другую структуру обхода кода) для перехвата вызовов ServiceController длявернуть консервированные результаты для целей тестирования.

Я согласен с тем, что для кода модели предметной области использование «традиционного» подхода модульного тестирования наиболее целесообразно, так как это приведет к разработке, которую проще всего поддерживать.Тем не менее, для кода, который имеет дело с реализацией .net связанных с API Windows вещей (файловая система, службы и т. Д.), Есть ли преимущество в выполнении дополнительной работы для получения «традиционно» тестируемого кода?

Мне трудно увидеть недостатки использования Microsoft Moles для таких вещей, как ServiceController (или объект File).Я действительно не вижу никакого преимущества в использовании традиционного подхода в этом случае.Я что-то упустил?

Ответы [ 2 ]

1 голос
/ 10 февраля 2011

Кстати, отличный вопрос. Только что посмотрел видео MS Moles прямо сейчас. Хотя я скептически отношусь к инструментам модульного тестирования MS, должен сказать, что это выглядит интересно. Мое сравнение составляет:

Адаптер / Фасад

  • Pro: позволяет извлечь значимую роль с помощью методов выявления намерений. например ServiceManager.StartService(name) может абстрагировать детали {1. ServiceController.GetServices (), 2. обрабатывать случай, когда ServiceController.Status! = Stopped, 3. ServiceController.Start ()}. Подход «ложный / поддельный» здесь потребует меньше работы, чем установка 3 делегатов. Здесь этот подход дает возможность улучшить свой дизайн, предлагая содержательные контракты / интерфейсы (также позволяет скрывать вещи, которые вас не интересуют, например семантика, константы и т. Д. Winapi)
  • Pro: фреймворки дадут вам лучшую диагностику для проверки аргументов, количества вызовов, ожиданий и т. Д.

Перехватчик

  • Pro: меньше работы, если вы просто заинтересованы в заглушении проблемного вызова зависимости
  • Pro: безусловно, хороший инструмент в вашем наборе инструментов, когда имеешь дело с устаревшим кодом (где страх изменений огромен)
  • Con: есть ли у него зависимость MSTest? Первоначальный поиск указывает на то, что вам нужны некоторые плагины или расширения, если вы не используете MSTest.
1 голос
/ 09 февраля 2011

Я считаю, что это хороший случай для насмешки, и есть несколько преимуществ использования IoC:

  • Вы проводите реальное юнит-тестирование, поскольку ваши тесты нетестирование нижележащих слоев - это будет интеграционный тест -.

  • Легко подключать и отключать макет объекта.

  • Вам не нужноопределить «фальшивую» реализацию на каждой заглушке.У вас "фальшивая", поддельная реализация по конфигурации.

Для меня первая причина самая важная.

Почему бы не использовать родинки?Потому что я считаю, что это не правильный инструмент для чего-то подобного.Moles больше подходит для таких вещей, как: я хочу установить фиксированное значение DateTime.Now в определенное время, поэтому вы можете протестировать некоторый код в любой ситуации, когда захотите без проблем.

Moles - это простой способ автоматическоговысмеивать определенные методы, свойства в конкретных тестах, в то время как IoC + подделка, это изолировать ваш тест.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...