2013-08-01 4 views
0

у меня есть недействительным метод, который я должен быть модульного тестирования, может кто-нибудь, пожалуйста, помогите мне, как сделать этоMS Test для Пустоты Методы

[TestMethod()] 
public void ProcessProductFeedTest() 
{ 
    // TODO: Initialize to an appropriate value 
    ProductDataServiceProvider target = new ProductDataServiceProvider(); 

    target.ProcessProductFeed(); 
    Assert.Inconclusive("A method that does not return a value cannot be verified."); 
} 

в приведенном выше коде ProcessProductFeed() является недействительным метод, который получает некоторые данные из базы данных SQL-сервера и публикует в TIBCO, как я могу написать единичный тестовый пример для того же

ответ

3

Ну, вы должны проверить, что данные публикуются в TIBCO, в основном.

Для любого метода ваши тесты должны либо проверить, что возвращаемое значение является правильным, если основная цель - вычислить что-либо или что соответствующие побочные эффекты произошли, если это основная цель метода. (Конечно, вы также проверяете условия ошибки.)

Не зная ничего о TIBCO или вашей архитектуре, я не могу прокомментировать, как вы собираетесь тестировать часть публикации. Я бы лично выделил три этапа чтения, обработки и публикации - тогда каждая часть может быть проверена изолированно от других.

+0

Особое внимание следует уделять тестированию каждого компонента в изоляции. Тестирование всего этого за один раз - IMHO очень опасно, так как это означает, что логические ошибки в бизнесе могут маскироваться другими слоями. – Mgetz

+0

Тестирование всех компонентов вместе было бы интеграционным тестом, а не единичным тестом. – Romoku

+0

@Romoku Я знаю, но люди часто забывают об этом и делают такие вещи, как [test moq] (http://stackoverflow.com/questions/15062403/moq-testing-void-method?rq=1) – Mgetz

3

Аннотация настойчивость и сообщение TIBCO из вашего класса. Например. вы можете использовать некоторые хранилища интерфейса для связи с SQL сервером:

public interface IProductsRepository 
{ 
    IEnumerable<Product> GetSomeProducts(); 
    // other members 
} 

и некоторыми воротами для communcation с TIBCO (я назвал его Шток, но вы должны предоставить конкретные имена бизнеса):

public interface IStockGateway 
{ 
    void DoSomethingWithProducts(IEnumerable<Product> products); 
    // other members 
} 

Затем сделайте ваш класс зависит от этих абстракций. Вы сможете высмеять их и проверить поведение класса:

public class ProductDataServiceProvider 
{ 
    private IProductsRepository _productRepository; 
    private IStockGateway _stockGateway; 

    // inject implementations 
    public ProductDataServiceProvider(
     IProductRepository productRepository, 
     IStockGateway stockGateway) 
    { 
     _productRepository = productRepository; 
     _stockGateway = stockGateway; 
    } 

    public void ProcessProductFeed() 
    { 
      // use repository and gateway 
    } 
} 

Теперь, чтобы проверить. Каковы обязанности вашего провайдера - получить некоторые продукты из репозитория продукта (реализация этого репозитория будет загружать продукты из базы данных SQL) и передать их на шлюз (реализация шлюза будет публиковать продукты в TIBCO). Вот тест, который использует библиотеку Moq:

[TestMethod] 
public void ShouldPassSomeProjectToStock() 
{ 
    // Arrange 
    var products = new List<Product>() { }; // create some products 
    var mockRepository = new Mock<IProductRepository>(); 
    mockRepository.Setup(r => r.GetSomeProducts()).Returns(products); 

    var mockGateway = new Mock<IStockGateway>(); 
    mockGateway.Setup(g => g.DoSomethingWithProducts(products)); 

    var provider = new ProductDataServiceProvider(mockRepository.Object, 
                ockGateway.Object); 
    // Act 
    provider.ProcessProductFeed(); 
    // Assert 
    mockRepository.VerifyAll(); // verify products retrieved from repository 
    mockGateway.VerifyAll(); // verify products passed to gateway 
} 
+1

отличный ответ, действительно Хорошее объяснение – CSharped

+0

@CSharped thanks :) Еще одна вещь - есть два типа тестирования - тестирование на основе состояния, которое проверяет состояние системы после ее осуществления (т.е. публичные свойства, возвращаемые результаты) и тестирование на основе взаимодействия, которое проверяет, как ваш объект связывается со своими зависимостями. Я рекомендую вам прочитать статью Фаулера [Mocks Are not Stubs] (http://www.martinfowler.com/articles/mocksArentStubs.html), чтобы лучше понять эти различные подходы –

+0

@CSharped также помнить, что тесты должны быть [ FIRST] (http://pragprog.com/magazines/2012-01/unit-tests-are-first), что означает, что вы не должны использовать настоящую базу данных или TIBCO, когда поставщик тестирования модулей –

Смежные вопросы