Рассмотрим следующий метод, который останавливает службу:
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
Чтобы выполнить модульное тестирование метода, у меня есть два варианта:
- Использование шаблона адаптера для переносаметоды класса
ServiceController
, которые мне нужны, в интерфейс, которым я могу управлять.Этот интерфейс затем может быть введен в класс обслуживания (иначе говоря, Inversion of Control).Таким образом, у меня есть слабосвязанный код, и я могу использовать традиционные тестовые среды для тестирования. - Сохраняйте класс как есть и используйте Microsoft Moles (или любую другую структуру обхода кода) для перехвата вызовов
ServiceController
длявернуть консервированные результаты для целей тестирования.
Я согласен с тем, что для кода модели предметной области использование «традиционного» подхода модульного тестирования наиболее целесообразно, так как это приведет к разработке, которую проще всего поддерживать.Тем не менее, для кода, который имеет дело с реализацией .net связанных с API Windows вещей (файловая система, службы и т. Д.), Есть ли преимущество в выполнении дополнительной работы для получения «традиционно» тестируемого кода?
Мне трудно увидеть недостатки использования Microsoft Moles для таких вещей, как ServiceController
(или объект File
).Я действительно не вижу никакого преимущества в использовании традиционного подхода в этом случае.Я что-то упустил?