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

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

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

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

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

Нет необходимости в UNIT-тестировании ваших WCF-сервисов, вполне нормально писать тесты INTEGRATION.

Michael Freidgeim 23.07.2013 16:32

Избегайте использования моков, юнит - это не класс без какой-либо внешней зависимости. Единица - это сквозной фрагмент бизнес-логики, даже если он включает в себя базу данных. Вы всегда можете использовать оперативную память или, что еще лучше, встроенную базу данных, такую ​​как BerkeleyDB, для тестирования. Вам не нужна настоящая база данных, находящаяся на другом компьютере. Таким образом, вы можете эффективно протестировать свое устройство без огромного количества насмешек.

Narendra Pathai 16.11.2014 11:31
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
18
2
13 511
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы хотите провести модульное тестирование классов обслуживания 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

Из martinfowler.com/bliki/InterfaceImplementationPair.html Использование интерфейсов, когда у вас не будет нескольких реализаций, требует дополнительных усилий для обеспечения синхронизации. Кроме того, он скрывает случаи, когда вы действительно предоставляете несколько реализаций. См. Больше примеров в stackoverflow.com/questions/90851/…

Michael Freidgeim 23.07.2013 15:37
Ответ принят как подходящий

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

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

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

Другие вопросы по теме