У нас есть целый набор библиотек DLL, которые предоставляют нам доступ к нашей базе данных, другим приложениям и службам.
Мы обернули эти библиотеки DLL тонким слоем службы WCF, который затем используют наши клиенты.
Я немного не уверен, как писать модульные тесты, которые проверяют только уровень службы WCF. Должен ли я просто писать модульные тесты для библиотек DLL и интеграционные тесты для служб WCF? Я был бы признателен за любую мудрость ... Я знаю, что если мои модульные тесты действительно идут в базу данных, они на самом деле не будут настоящими модульными тестами. Я также понимаю, что мне действительно не нужно тестировать узел службы WCF в модульном тесте.
Итак, я не понимаю, что именно тестировать и как.
Избегайте использования моков, юнит - это не класс без какой-либо внешней зависимости. Единица - это сквозной фрагмент бизнес-логики, даже если он включает в себя базу данных. Вы всегда можете использовать оперативную память или, что еще лучше, встроенную базу данных, такую как BerkeleyDB, для тестирования. Вам не нужна настоящая база данных, находящаяся на другом компьютере. Таким образом, вы можете эффективно протестировать свое устройство без огромного количества насмешек.





Если вы хотите провести модульное тестирование классов обслуживания 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
Из martinfowler.com/bliki/InterfaceImplementationPair.html Использование интерфейсов, когда у вас не будет нескольких реализаций, требует дополнительных усилий для обеспечения синхронизации. Кроме того, он скрывает случаи, когда вы действительно предоставляете несколько реализаций. См. Больше примеров в stackoverflow.com/questions/90851/…
Потребителя вашей услуги не волнует, что находится под вашей услугой. Чтобы действительно протестировать уровень обслуживания, я думаю, что ваш уровень должен перейти к библиотекам DLL и базе данных и написать хотя бы тест CRUD.
Это зависит от того, что делает тонкая служба WCF. Если он действительно тонкий и в нем нет интересного кода, не беспокойтесь о его модульном тестировании. Не бойтесь не тестировать что-либо, если там нет настоящего кода. Если тест не может быть хотя бы на один уровень проще, чем тестируемый код, не беспокойтесь. Если код тупой, тест тоже будет тупым. Вы не хотите, чтобы у вас было больше глупого кода.
Если у вас есть тесты, которые доходят до базы данных, тогда отлично! Так даже лучше. Это не «настоящий модульный тест»? Без проблем.
Нет необходимости в UNIT-тестировании ваших WCF-сервисов, вполне нормально писать тесты INTEGRATION.