Как мне протестировать сервис WCF?
-
09-06-2019 - |
Вопрос
У нас есть целая куча библиотек DLL, которые дают нам доступ к нашей базе данных и другим приложениям и службам.
Мы обернули эти библиотеки DLL тонким слоем службы WCF, который затем потребляют наши клиенты.
Я немного не уверен в том, как писать модульные тесты, которые проверяют только уровень сервиса WCF. Должен ли я просто написать модульные тесты для библиотек DLL и интеграционные тесты для служб WCF? Я был бы признателен за любую мудрость ... Я знаю, что если мои модульные тесты действительно перейдут в базу данных, они не будут настоящими модульными тестами. Я также понимаю, что мне не нужно тестировать хост службы WCF в модульном тесте. Р>
Итак, я не совсем понимаю, что именно тестировать и как.
Решение
Потребителю вашей услуги не важно, что находится под вашей услугой. Чтобы действительно протестировать ваш сервисный уровень, я думаю, что ваш уровень должен перейти к библиотекам DLL и базе данных и написать как минимум CRUD test. Р>
Другие советы
Если вы хотите провести модульное тестирование классов обслуживания WCF, убедитесь, что вы проектируете их с учетом слабой связи, чтобы вы могли смоделировать каждую зависимость, поскольку вы хотите только проверить логику внутри самого класса обслуживания.
Например, в приведенном ниже сервисе я взломал свой репозиторий доступа к данным, используя «инъекцию зависимостей бедного человека».
Public Class ProductService
Implements IProductService
Private mRepository As IProductRepository
Public Sub New()
mRepository = New ProductRepository()
End Sub
Public Sub New(ByVal repository As IProductRepository)
mRepository = repository
End Sub
Public Function GetProducts() As System.Collections.Generic.List(Of Product) Implements IProductService.GetProducts
Return mRepository.GetProducts()
End Function
End Class
На клиенте вы можете смоделировать саму службу WCF, используя интерфейс контракта на обслуживание.
<TestMethod()> _
Public Sub ShouldPopulateProductsListOnViewLoadWhenPostBackIsFalse()
mMockery = New MockRepository()
mView = DirectCast(mMockery.Stub(Of IProductView)(), IProductView)
mProductService = DirectCast(mMockery.DynamicMock(Of IProductService)(), IProductService)
mPresenter = New ProductPresenter(mView, mProductService)
Dim ProductList As New List(Of Product)()
ProductList.Add(New Product)
Using mMockery.Record()
SetupResult.For(mView.PageIsPostBack).Return(False).Repeat.Once()
Expect.Call(mProductService.GetProducts()).Return(ProductList).Repeat.Once()
End Using
Using mMockery.Playback()
mPresenter.OnViewLoad()
End Using
'Verify that we hit the service dependency during the method when postback is false
Assert.AreEqual(1, mView.Products.Count)
mMockery.VerifyAll()
End Sub
Это зависит от того, что делает тонкий сервис WCF. Если он действительно тонкий и там нет интересного кода, не беспокойтесь о его модульном тестировании. Не бойтесь ничего не тестировать, если там нет реального кода. Если тест не может быть хотя бы на один уровень проще, чем тестируемый код, не беспокойтесь. Если код глуп, тест также будет тупым. Вы не хотите иметь больше глупого кода для поддержки.
Если у вас могут быть тесты, вплоть до БД, то отлично! Это даже лучше. Это не «настоящий юнит-тест»? Без проблем. Р>