我们拥有一大堆DLL,可以让我们访问我们的数据库和其他应用程序和服务。
我们已经使用瘦WCF服务层包装这些DLL,客户端随后会使用它。
我对如何编写仅测试WCF服务层的单元测试有点不确定。我应该只编写DLL的单元测试,以及WCF服务的集成测试吗?我很欣赏任何智慧......我知道如果我的单元测试实际上进入数据库,它们实际上并不是真正的单元测试。我也明白我不需要在单元测试中测试WCF服务主机。
所以,我对确切测试的内容和方式感到困惑。
答案 0 :(得分:7)
如果要对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
答案 1 :(得分:7)
这取决于瘦WCF服务的功能。如果它真的很薄,那里没有有趣的代码,请不要打扰单元测试。如果那里没有真正的代码,不要害怕不进行单元测试。如果测试不能至少一级更简单,那么测试下的代码,不要打扰。如果代码是愚蠢的,测试也将是愚蠢的。您不希望有更多愚蠢的代码需要维护。
如果你可以进行一直到db的测试那么棒!它甚至更好。这不是“真正的单元测试吗?”根本不是问题。
答案 2 :(得分:4)
您服务的消费者并不关心您服务的内容。 要真正测试您的服务层,我认为您的图层需要转到DLL和数据库,并至少编写CRUD测试。