如何对WCF服务进行单元测试?

如何对WCF服务进行单元测试?

How do I unit test a WCF service?

我们有一堆DLL,可让我们访问数据库以及其他应用程序和服务。

我们用瘦的WCF服务层包装了这些DLL,然后我们的客户就使用了该服务层。

我对如何编写仅测试WCF服务层的单元测试不 我是否应该只为DLL编写单元测试,为WCF服务编写集成测试? 我将不胜感激……我知道,如果我的单元测试实际上进入了数据库,那么它们实际上并不是真正的单元测试。 我也了解到,我真的不需要在单元测试中测试WCF服务主机。

因此,我对要测试什么以及如何进行测试感到困惑。


这取决于瘦WCF服务的功能。如果它真的很薄并且那里没有有趣的代码,请不要对它进行单元测试。如果那里没有真正的代码,不要害怕不对单元进行测试。如果测试不能比编写的代码简单至少一级,请不要打扰。如果代码是愚蠢的,则测试也将是愚蠢的。您不想维护更多的哑代码。

如果您可以进行一直到数据库的测试,那就太好了!更好。这不是"真正的单元测试"吗?完全没有问题。


如果要对WCF服务类进行单元测试,请确保在设计它们时考虑到松散耦合,以便当您只想测试服务类本身内部的逻辑时,可以模拟出每个依赖项。

例如,在以下服务中,我使用"穷人的依赖注入"分解数据访问存储库。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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服务本身。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<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

服务的使用者并不关心服务的底层内容。
为了真正测试您的服务层,我认为您的层需要深入到DLL和数据库并至少编写CRUD测试。


推荐阅读