Как создать значимые юнит-тесты для подделок - PullRequest
3 голосов
/ 16 марта 2011

Я понимаю основы того, как проводить модульное тестирование, однако я часто испытываю трудности с поиском значимых вещей для тестирования.Я считаю, что я должен создать фальшивую реализацию и внедрить ее в потребителя.У меня есть класс обслуживания, отвечающий за подписку (с использованием веб-служб Exchange (EWS)) на Exchange 2010 с запросом обновлений для новой почты.Чтобы отделить мою реализацию подписки от самой службы, я решил внедрить реализацию в службу.Ниже то, что у меня сейчас есть.Я пропустил код, касающийся конкретно взаимодействия с Exchange.

// Not a big fan of having two identical interfaces...
public interface IStreamingNotificationService
{
    void Subscribe();
}

public interface IExchangeService
{
    void Subscribe();
}

public class StreamingNotificationService : IStreamingNotificationService
{
    private readonly IExchangeService _exchangeService;

    public StreamingNotificationService(IExchangeService exchangeService)
    {
        if (exchangeService == null)
        {
            throw new ArgumentNullException("exchangeService");
        }

        _exchangeService = exchangeService;
    }

    public void Subscribe()
    {
        _exchangeService.Subscribe();
    }
}

public class ExchangeServiceImpl : IExchangeService
{
    private readonly INetworkConfiguration _networkConfiguration;
    private ExchangeService ExchangeService { get; set; }

    public ExchangeServiceImpl(INetworkConfiguration networkConfiguration)
    {
        if (networkConfiguration == null)
        {
            throw new ArgumentNullException("networkConfiguration");
        }

        _networkConfiguration = networkConfiguration;
        // Set up EWS 
    }

    public void Subscribe()
    {
        // Subscribe for new mail notifications.
    }
}

В частности, как мне создать содержательный модульный тест, чтобы подписка работала так, как должна?

Ответы [ 2 ]

3 голосов
/ 17 марта 2011

Обычно вы используете фальшивый фреймворк для создания поддельного обмена и тестирования этого объекта, который действительно назывался Subscribe. Я обычно использую Rhino Mocks , и ваш тест будет выглядеть, например, вот так (есть много способов реализовать это):

[Test]
public void SubscribesToExchange()
{
  var exchange = MockRepository.GenerateMock<IExchangeService>(); //this is the stub
  var service = StreamingNotificationService(exchange); //this is the object we are testing

  service.Subscribe();
  service.AssertWasCalled(x => x.Subscribe(););
}
1 голос
/ 17 марта 2011

Разделение и впрыскивание всегда очень хорошая идея с точки зрения юнит-тестирования.

Теперь вы можете легко протестировать свой класс StreamingNotificationService. Все, что вам нужно сделать, это проверить, хорошо ли ведет себя конструкция, и если метод подписки вызывает ваш внедренный (и фальшивый) IExchangeService.

...