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