Wie teste ich einen WCF-Dienst in einer Einheit?
-
09-06-2019 - |
Frage
Wir verfügen über eine ganze Reihe von DLLs, die uns Zugriff auf unsere Datenbank und andere Anwendungen und Dienste ermöglichen.
Wir haben diese DLLs mit einer dünnen WCF-Dienstschicht umhüllt, die unsere Kunden dann nutzen.
Ich bin etwas unsicher, wie man Komponententests schreibt, die nur die WCF-Dienstschicht testen.Sollte ich nur Unit-Tests für die DLLs und Integrationstests für die WCF-Dienste schreiben?Ich würde mich über jede Weisheit freuen ...Ich weiß, dass meine Unit-Tests, wenn sie tatsächlich in die Datenbank gehen, keine echten Unit-Tests sind.Mir ist auch klar, dass ich den WCF-Diensthost nicht wirklich in einem Komponententest testen muss.
Daher weiß ich nicht genau, was ich testen soll und wie.
Lösung
Dem Verbraucher Ihres Dienstes ist es egal, was sich hinter Ihrem Dienst verbirgt.Um Ihre Serviceschicht wirklich zu testen, muss Ihre Schicht meiner Meinung nach bis zu den DLLs und der Datenbank reichen und zumindest schreiben CRUD prüfen.
Andere Tipps
Wenn Sie Ihre WCF-Dienstklassen einem Unit-Test unterziehen möchten, stellen Sie sicher, dass Sie sie unter Berücksichtigung der losen Kopplung entwerfen, damit Sie jede Abhängigkeit simulieren können, da Sie nur die Logik innerhalb der Dienstklasse selbst testen möchten.
Im folgenden Dienst teile ich beispielsweise mein Datenzugriffs-Repository mithilfe von „Poor Man's Dependency Injection“ auf.
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
Auf dem Client können Sie den WCF-Dienst selbst über die Schnittstelle des Dienstvertrags verspotten.
<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
Es hängt davon ab, was der Thin WCF-Dienst tut.Wenn es wirklich dünn ist und es dort keinen interessanten Code gibt, machen Sie sich nicht die Mühe, es einem Unit-Test zu unterziehen.Haben Sie keine Angst davor, etwas nicht einem Unit-Test zu unterziehen, wenn dort kein echter Code vorhanden ist.Wenn der Test nicht mindestens eine Ebene einfacher sein kann als der zu testende Code, machen Sie sich keine Mühe.Wenn der Code dumm ist, ist auch der Test dumm.Sie möchten nicht noch mehr dummen Code pflegen müssen.
Wenn Sie Tests durchführen können, die bis zur Datenbank reichen, dann ist das großartig!Es ist sogar noch besser.Es ist kein "wahrer Einheitstest?" Absolut kein Problem.