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