如何对WCF服务进行单元测试?
时间:2020-03-05 18:45:48 来源:igfitidea点击:
我们有一堆DLL,这些DLL使我们可以访问数据库以及其他应用程序和服务。
我们已经用瘦的WCF服务层包装了这些DLL,然后我们的客户就使用了该服务层。
我不确定如何编写仅测试WCF服务层的单元测试。我应该只为DLL编写单元测试,还是为WCF服务编写集成测试吗?我将不胜感激……我知道,如果我的单元测试实际上进入了数据库,那么它们实际上并不是真正的单元测试。我也了解到,我真的不需要在单元测试中测试WCF服务主机。
因此,我对要测试什么以及如何进行测试感到困惑。
解决方案
回答
如果要对WCF服务类进行单元测试,请确保在设计它们时考虑到松散耦合,以便当我们只想测试服务类本身内部的逻辑时,可以模拟出每个依赖项。
例如,在以下服务中,我使用"穷人的依赖注入"来分解我的数据访问存储库。
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
回答
服务的使用者并不关心服务的底层内容。
为了真正测试服务层,我认为层需要深入到DLL和数据库并至少编写CRUD测试。
回答
这取决于瘦WCF服务的功能。如果它真的很薄并且那里没有有趣的代码,请不要对它进行单元测试。如果没有真正的代码,不要害怕不对单元进行测试。如果测试不能比编写的代码至少简单一级,请不要打扰。如果代码是哑的,则测试也将是哑的。我们不想维护更多的愚蠢代码。
如果我们可以将测试一直带到数据库,那就太好了!更好。这不是"真正的单元测试"吗?完全不是问题。