2008-09-01 4 views
18

Tenemos un montón de archivos DLL que nos dan acceso a nuestra base de datos y otras aplicaciones y servicios.¿Cómo compruebo la unidad de un servicio WCF?

Hemos envuelto estos archivos DLL con una delgada capa de servicio WCF que nuestros clientes 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.

Por lo tanto, estoy confundido sobre exactamente qué probar y cómo.

+1

No es necesario que UNIT pruebe sus servicios de WCF, está perfectamente bien escribir pruebas de INTEGRACIÓN. –

+0

Evite el uso de simulaciones, una unidad no es una clase sin dependencia externa. Una unidad es una parte integral de la lógica de negocios, incluso si se trata de una base de datos. Siempre puede usar una memoria interna o incluso mejor utilizar una base de datos incrustada como BerkeleyDB para probar. No necesita una base de datos real que resida en otra máquina. De esta forma puedes probar tu unidad de manera efectiva sin gran burla. –

Respuesta

4

Al consumidor de su servicio no le importa lo que hay debajo de su servicio. Para realmente poner a prueba su capa de servicio, creo que su capa debe ir a las DLL y la base de datos y escribir al menos CRUD prueba.

7

Si desea probar la unidad de sus clases de servicio WCF, asegúrese de diseñarlas teniendo en cuenta el acoplamiento flojo 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 rompo 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 simular el servicio WCF utilizando 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 
+0

Para simular el servicio wcf, consulte http://stackoverflow.com/a/10306934/52277 –

+0

desde http://martinfowler.com/bliki/InterfaceImplementationPair.html Usar interfaces cuando no va a tener múltiples implementaciones es adicional Esfuerzo para mantener todo sincronizado. Además, oculta los casos en los que realmente proporciona múltiples implementaciones. Vea más ejemplos en http://stackoverflow.com/questions/90851/is-creating-interfacesfor-almost-every-class- justified-or-are-interfaces-overus –

7

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 realizar pruebas que lleguen hasta la base de datos, ¡genial! Es aún mejor No es una "verdadera prueba de unidad"? No es un problema en absoluto.

Cuestiones relacionadas