¿Cómo pruebo la unidad de un servicio WCF?
unit-testing (3)
Tenemos un montón de archivos DLL que nos dan acceso a nuestra base de datos y otras aplicaciones y servicios.
Hemos envuelto estos archivos DLL con una delgada capa de servicio WCF que nuestros clientes luego consumen.
No estoy seguro de cómo escribir pruebas unitarias que solo prueben la capa de servicio WCF. ¿Debo simplemente escribir pruebas unitarias para los archivos DLL y pruebas de integración para los servicios WCF? Agradecería cualquier sabiduría ... Sé que si las pruebas de mi unidad van realmente a la base de datos, en realidad no serán verdaderas pruebas unitarias. También entiendo que realmente no necesito probar el host del servicio WCF en una prueba unitaria.
Entonces, estoy confundido sobre exactamente qué probar y cómo.
Al consumidor de su servicio no le importa lo que hay debajo de su servicio. Para realmente probar tu capa de servicio, creo que tu capa necesita ir a las DLL y a la base de datos y escribir al menos la prueba CRUD .
Depende de lo que haga el servicio WCF delgado. Si es muy delgado y no hay ningún código interesante allí, no te molestes en probarlo unitariamente. No tengas miedo de no probar algo si no hay un código real allí. Si la prueba no puede ser al menos un nivel más simple que el código bajo la prueba, no se moleste. Si el código es tonto, la prueba también será tonta. No desea tener más código tonto para mantener.
Si puede tener pruebas que lleguen hasta el DB ¡entonces genial! Es aún mejor No es una "verdadera prueba de unidad"? No es un problema en absoluto.
Si desea probar las clases de servicio WCF, asegúrese de diseñarlas teniendo en cuenta el acoplamiento libre para que pueda simular cada dependencia, ya que solo quiere probar la lógica dentro de la clase de servicio.
Por ejemplo, en el siguiente servicio divido mi repositorio de acceso a datos usando "Poor Man''s Dependency Injection".
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
En el cliente puede burlarse del servicio WCF usando la interfaz del contrato de servicio.
<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