Страницы

вторник, 23 августа 2011 г.

Реализуем EventPublisher. Шаг третий. Слово о тестировании.

 Еще одна важная часть процесса разработки - модульное тестирование. Всё описанное ниже можно заменить на использование мок-объектов. Но лично меня часто раздражает их многословный и не всегда легко читаемый лямбда-синтаксис. Собственно, как помочь в деле деле тестирования? Мне видятся две вещи:
  1. Реализация IPublisher в простом и надёжном варианте. В первую очередь - простое подписывание слушателей,  и однопоточность. 
  2. Удобный класс-помощник для Assert выражений.

Для первого пункта можно сделать простой наследник от Publisher, заранее инициализировав все свойства. Например так:

public class TestPublisher : Publisher
{
public IAssignee Assignee 
{ 
  get { return (IAssignee) ListenerSource; } 
}

public TestPublisher() : base(new SimpleAssignee(), new SimplePublishWay())
{
}
}

С тестовым Publisher`ом всё. Теперь перейдём к assert-помощнику. Какие функции он должен нести? Неким образом фиксировать количество вызовов, и полученные сообщения. И еще лучше - лёгко читаемый синтаксис. И вот что в итоге у меня получилось:
public class TestListener<TMessage> : IListener<TMessage>
{
  private readonly List<TMessage> _messages;

  public TestListener()
  {
    _messages = new List<TMessage>();
  }

  public int WasCalled { get; private set; }

  public bool WasCalledAtLeastOnce
  {
    get { return WasCalled > 0; }
  }

  public TMessage LastMessage
  {
    get { return _messages.Last(); }
  }

  public IList<TMessage> Messages
  {
    get { return _messages.AsReadOnly(); }
  }

  public bool WasCalledOnce
  {
    get { return WasCalled == 1; }
  }

  public void ListenTo(TMessage message)
  {
    WasCalled++;
    _messages.Add(message);
  }
}
И как бы это выглядело в тесте:

[Test]
public void SomeTest()
{
   Assert.That(listener.WasCalledOnce);
}
Выглядит достаточно читаемо. По крайней мере для меня :)

Комментариев нет:

Отправить комментарий