WCF サービスの単体テストを行うにはどうすればよいですか?
-
09-06-2019 - |
質問
データベースや他のアプリケーションやサービスへのアクセスを可能にする DLL が大量にあります。
これらの DLL を薄い WCF サービス層でラップし、クライアントがそれを使用します。
WCF サービス層のみをテストする単体テストの作成方法が少しわかりません。DLL の単体テストと WCF サービスの統合テストを作成するだけでよいでしょうか?何か知恵をいただければ幸いです...私の単体テストが実際にデータベースに送信される場合、それらは実際には真の単体テストではないことはわかっています。また、単体テストで WCF サービス ホストを実際にテストする必要がないことも理解しています。
したがって、正確に何をどのようにテストするかについて混乱しています。
解決
サービスの利用者は、サービスの根底にあるものを気にしません。サービス層を実際にテストするには、層を DLL とデータベースまで掘り下げて、少なくとも次のように記述する必要があると思います。 クラッド テスト。
他のヒント
WCF サービス クラスを単体テストする場合は、サービス クラス自体の内部のロジックのみをテストするため、各依存関係を模擬できるように、疎結合を念頭に置いてクラスを設計してください。
たとえば、以下のサービスでは、「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
クライアントでは、サービス コントラクトのインターフェイスを使用して、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
それは、シン WCF サービスが何を行うかによって異なります。それが本当に薄く、そこに興味深いコードがない場合は、わざわざ単体テストを行わないでください。実際のコードがない場合は、単体テストを行わないことを恐れないでください。テスト対象のコードよりも少なくとも 1 レベル以上単純なテストができない場合でも、気にする必要はありません。コードが愚かであれば、テストも愚かになります。保守しなければならない愚かなコードがこれ以上増えることは望ましくありません。
データベースに至るまでのテストができれば、それは素晴らしいことです。さらに良いです。「真の単位テスト」ではありませんか?まったく問題ではありません。