Come posso testare un servizio WCF?
-
09-06-2019 - |
Domanda
Abbiamo un sacco di DLL che ci danno accesso al nostro database e ad altre applicazioni e servizi.
Abbiamo avvolto queste DLL con un sottile livello di servizio WCF che i nostri clienti poi utilizzano.
Sono un po' incerto su come scrivere unit test che testino solo il livello di servizio WCF.Dovrei semplicemente scrivere unit test per le DLL e test di integrazione per i servizi WCF?Apprezzerei qualsiasi saggezza...So che se i miei test unitari vanno effettivamente al database non saranno effettivamente veri test unitari.Capisco anche che non ho davvero bisogno di testare l'host del servizio WCF in un test unitario.
Quindi, sono confuso su cosa testare esattamente e come.
Soluzione
Al consumatore del tuo servizio non interessa cosa c'è sotto il tuo servizio.Per testare davvero il tuo livello di servizio, penso che il tuo livello debba scendere nelle DLL e nel database e scrivere almeno CRUDO test.
Altri suggerimenti
Se desideri testare l'unità delle tue classi di servizio WCF, assicurati di progettarle tenendo presente l'accoppiamento libero in modo da poter deridere ogni dipendenza poiché desideri solo testare la logica all'interno della classe di servizio stessa.
Ad esempio, nel servizio seguente esploro il mio repository di accesso ai dati utilizzando "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
Sul client è possibile simulare il servizio WCF stesso utilizzando l'interfaccia del contratto di servizio.
<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
Dipende da cosa fa il servizio WCF sottile.Se è davvero scarno e non c'è codice interessante, non preoccuparti di testarlo.Non aver paura di non testare qualcosa se non c'è un codice reale lì.Se il test non può essere almeno un livello più semplice del codice sotto il test, non preoccuparti.Se il codice è stupido, anche il test sarà stupido.Non vuoi avere più codice stupido da mantenere.
Se riesci ad avere test che arrivano fino al db, allora fantastico!È ancora meglio.Non è un "vero test unitario?" Non è affatto un problema.