Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I unit test a WCF service?

We have a whole bunch of DLLs that give us access to our database and other applications and services.

We've wrapped these DLLs with a thin WCF service layer which our clients then consume.

I'm a little unsure on how to write unit tests that only test the WCF service layer. Should I just write unit tests for the DLLs, and integration tests for the WCF services? I'd appreciate any wisdom... I know that if my unit tests actually go to the database they won't actually be true unit tests. I also understand that I don't really need to test the WCF service host in a unit test.

So, I'm confused about exactly what to test and how.

like image 595
Esteban Araya Avatar asked Sep 01 '08 02:09

Esteban Araya


People also ask

Can we test WCF service in soapUI?

No need to have a WCF . NET Client as of now to test and monitor HTTP traffic of WCF service calls. Open soapUI and set the following settings. Make sure the service's wsdl path is correct.

How do I run a WCF test Client in VS 2019?

In Visual Studio 2019 go to: Tools > Get Tools and Features > Select the Individual Components tab > Type wcf in the search box and install it. This installs the component, and you should be able to load it from the command prompt or other methods suggested in the answer.

How do I run a WCF service?

To open WCF Test Client, open Developer Command Prompt for Visual Studio and execute WcfTestClient.exe. Select Add Service from the File menu. Type http://localhost:8080/hello into the address box and click OK. Make sure the service is running or else this step fails.


3 Answers

If you want to unit test your WCF service classes make sure you design them with loose coupling in mind so you can mock out each dependancy as you only want to test the logic inside the service class itself.

For example, in the below service I break out my data access repository using "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

On the client you can mock the WCF service itself using the interface of the service contract.

<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
like image 99
Toran Billups Avatar answered Dec 14 '22 04:12

Toran Billups


It depends on what the thin WCF service does. If it's really thin and there's no interesting code there, don't bother unit testing it. Don't be afraid to not unit test something if there's no real code there. If the test cannot be at least one level simpler then the code under the test, don't bother. If the code is dumb, the test will also be dumb. You don't want to have more dumb code to maintain.

If you can have tests that go all the way to the db then great! It's even better. It's not a "true unit test?" Not a problem at all.

like image 33
Jan Soltis Avatar answered Dec 14 '22 02:12

Jan Soltis


The consumer of your service doesn't care what's underneath your service. To really test your service layer, I think your layer needs to go down to DLLs and the database and write at least CRUD test.

like image 27
Eugene Yokota Avatar answered Dec 14 '22 02:12

Eugene Yokota