Как модульное тестирование службы WCF?

голоса
18

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

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

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

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

Задан 01/09/2008 в 03:13
источник пользователем
На других языках...                            


3 ответов

голоса
7

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

Например, в приведенной ниже службе я нарушу мое хранилище для доступа к данным с помощью «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
Ответил 01/09/2008 в 03:26
источник пользователем

голоса
4

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

Ответил 01/09/2008 в 03:27
источник пользователем

голоса
7

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

Если вы можете иметь тесты, которые идут весь путь к БД, то здорово! Это даже лучше. Это не «настоящее испытание блока?» Без проблем.

Ответил 01/09/2008 в 20:19
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more