Как unit test служба WCF?

У нас есть целая куча DLL, которые дают нам доступ к нашей базе данных и другим приложениям и сервисам.

Мы обернули эти библиотеки с помощью тонкого слоя обслуживания WCF, который затем потребляют наши клиенты.

Я немного не уверен, как писать модульные тесты, которые проверяют только уровень сервиса WCF. Должен ли я просто писать модульные тесты для библиотек DLL и интеграционные тесты для служб WCF? Я был бы признателен за любую мудрость... Я знаю, что если мои модульные тесты действительно отправятся в базу данных, они фактически не будут настоящими модульными тестами. Я также понимаю, что мне действительно не нужно тестировать хост службы WCF в unit test.

Итак, я смущен точно, что тестировать и как.

Ответ 1

Потребителю вашего сервиса все равно, что под вашим сервисом. Чтобы действительно протестировать ваш уровень обслуживания, я думаю, что ваш слой должен перейти в библиотеки DLL и базу данных и написать как минимум CRUD.

Ответ 2

Если вы хотите unit test ваши классы обслуживания WCF, убедитесь, что вы создаете их с учетом свободной связи, поэтому вы можете издеваться над каждой зависимостью, поскольку вы хотите протестировать логику внутри самого класса сервиса.

Например, в приведенной ниже службе я выхожу из своего репозитория доступа к данным, используя "Injection 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

На клиенте вы можете издеваться над самой службой 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

Ответ 3

Это зависит от того, что делает тонкая служба WCF. Если он действительно тонкий и там нет интересного кода, не беспокойтесь об этом, проверяя его. Не бойтесь не unit test, если там нет реального кода. Если тест не может быть, по крайней мере, на одном уровне проще, чем код под тестом, не беспокойтесь. Если код немой, тест также будет немым. Вы не хотите иметь больше немого кода для поддержки.

Если у вас есть тесты, которые идут полностью в db, тогда здорово! Это еще лучше. Это не "правда unit test?" Без проблем.