Como faço para testar a unidade de um serviço WCF?
-
09-06-2019 - |
Pergunta
Temos um monte de DLLs que nos dão acesso ao nosso banco de dados e outros aplicativos e serviços.
Envolvemos essas DLLs com uma fina camada de serviço WCF que nossos clientes consomem.
Não tenho certeza de como escrever testes de unidade que testem apenas a camada de serviço WCF.Devo apenas escrever testes unitários para as DLLs e testes de integração para os serviços WCF?Eu apreciaria qualquer sabedoria ...Eu sei que se meus testes de unidade realmente forem para o banco de dados, eles não serão testes de unidade verdadeiros.Também entendo que realmente não preciso testar o host do serviço WCF em um teste de unidade.
Então, estou confuso sobre exatamente o que testar e como.
Solução
O consumidor do seu serviço não se importa com o que está por baixo do seu serviço.Para realmente testar sua camada de serviço, acho que sua camada precisa ir até as DLLs e ao banco de dados e escrever pelo menos CRUD teste.
Outras dicas
Se você deseja testar a unidade de suas classes de serviço WCF, certifique-se de projetá-las com o acoplamento fraco em mente, para poder simular cada dependência, pois deseja apenas testar a lógica dentro da própria classe de serviço.
Por exemplo, no serviço abaixo eu divido meu repositório de acesso a dados usando "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
No cliente você pode simular o próprio serviço WCF usando a interface do contrato de serviço.
<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
Depende do que o serviço Thin WCF faz.Se for muito fino e não houver nenhum código interessante lá, não se preocupe em testá-lo na unidade.Não tenha medo de não testar algo se não houver código real lá.Se o teste não puder ser pelo menos um nível mais simples que o código em teste, não se preocupe.Se o código for burro, o teste também será burro.Você não quer ter mais códigos idiotas para manter.
Se você puder fazer testes que vão até o banco de dados, ótimo!É ainda melhor.Não é um "teste de unidade verdadeiro?" Não um problema de todos.