Еще одна важная часть процесса разработки - модульное тестирование. Всё описанное ниже можно заменить на использование мок-объектов. Но лично меня часто раздражает их многословный и не всегда легко читаемый лямбда-синтаксис. Собственно, как помочь в деле деле тестирования? Мне видятся две вещи:
Для первого пункта можно сделать простой наследник от Publisher, заранее инициализировав все свойства. Например так:
С тестовым Publisher`ом всё. Теперь перейдём к assert-помощнику. Какие функции он должен нести? Неким образом фиксировать количество вызовов, и полученные сообщения. И еще лучше - лёгко читаемый синтаксис. И вот что в итоге у меня получилось:
- Реализация IPublisher в простом и надёжном варианте. В первую очередь - простое подписывание слушателей, и однопоточность.
- Удобный класс-помощник для 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);
}
Выглядит достаточно читаемо. По крайней мере для меня :)
Комментариев нет:
Отправить комментарий