WCF サービスの単体テストを行うにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/37375

  •  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 レベル以上単純なテストができない場合でも、気にする必要はありません。コードが愚かであれば、テストも愚かになります。保守しなければならない愚かなコードがこれ以上増えることは望ましくありません。

データベースに至るまでのテストができれば、それは素晴らしいことです。さらに良いです。「真の単位テスト」ではありませんか?まったく問題ではありません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top