2008-09-01 59 views
18

私たちは、データベースや他のアプリケーションやサービスにアクセスするためのDLLをたくさん用意しています。WCFサービスを単体テストするにはどうすればよいですか?

これらのDLLは、クライアントが消費する薄いWCFサービスレイヤでラップしています。

私は、WCFサービスレイヤーをテストするだけの単体テストの記述方法については少し不明です。私はDLLの単体テストとWCFサービスの統合テストを書くべきでしょうか?私はどんな知恵にも感謝しています...私のユニットテストが実際にデータベースに行くと、実際には真のユニットテストではないことがわかります。また、WCFサービスホストを単体テストでテストする必要はありません。

だから、私は何をテストするのか、どういうものなのか混乱しています。

+1

UNITテストではWCFサービスをテストする必要はありませんが、INTEGRATIONテストを作成することは可能です。 –

+0

モックを使用しないでください。ユニットは外部依存関係のないクラスではありません。 1つのユニットは、データベースを含む場合でも、ビジネスロジックのエンドツーエンドのスライスです。 BerkeleyDBなどの組み込みデータベースを使用して、いつでもメモリ内で使用することができます。他のマシンに存在する実際のデータベースは必要ありません。そうすれば、莫大な量の嘲笑なく効果的にユニットをテストすることができます。 –

答えて

4

あなたのサービスの消費者は、あなたのサービスの下に何があるか気にしません。 サービス層を実際にテストするには、DLLとデータベースに移動し、少なくともCRUDのテストを作成する必要があります。

7

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 
+0

wcfサービスを模擬するにはhttp://stackoverflow.com/a/10306934/52277 –

+0

からhttp://martinfowler.com/bliki/InterfaceImplementationPair.html 複数の実装を持たない場合は、インターフェイスを使用することは余分ですあなたが実際に複数の実装を提供しているケースを隠します。 http://stackoverflow.com/questions/90851/is-creating-interfacesfor-almost-every-class-justified-or-are-interfaces-overusのサンプルをもっと見る –

7

シン・WCFサービスの機能によって異なります。それが本当に薄く、そこに興味深いコードがないなら、それをテストするユニットには気にしないでください。実際のコードがない場合、ユニットテストの何かを恐れないでください。テストが少なくとも1つのレベルより簡単ではない場合、テストの下のコードは、気にしないでください。コードがダムであれば、テストもダムになります。あなたは、維持するために多くの愚かなコードを持つことを望んでいません。

あなたは、dbまでのすべての方法を行くテストをすることができます!それはさらに良いです。それは「真のユニットテスト」ではない?全く問題ありません。

関連する問題