Что мешает вам обернуть это?
public interface ITimer
{
void Start(double interval);
void Stop();
event ElapsedEventHandler Elapsed;
}
Это почти все, что нужно вашему интерфейсу.Давайте посмотрим, как это может произойти (обратите внимание, что вы, конечно, могли бы предоставить больше Timer
свойств, но этого достаточно, чтобы этого хватило):
public class MyTimer : ITimer
{
private Timer timer = new Timer();
public void Start(double interval)
{
timer.Interval = interval;
timer.Start();
}
public void Stop()
{
timer.Stop();
}
public event ElapsedEventHandler Elapsed
{
add { this.timer.Elapsed += value; }
remove { this.timer.Elapsed -= value; }
}
}
Теперь, как бы вы использовали это в своемтестирование (при условии, что мы используем FakeItEasy в качестве фреймворка выбора):
var timerFake = A.Fake<ITimer>();
var classUnderTest = new MyClass(timerFake);
// tell fake object to raise event now
timerFake.Elapsed += Raise.With<ElapsedEventArgs>(ElapsedEventArgs.Empty).Now;
// assert whatever was supposed to happen as event response, indeed did
Assert.That(classUnderTest.ReceivedEvent, Is.True);
Пример выше на самом деле действительно тестирует код, который происходит после того, каксобытие по таймеру сгенерировано .Представьте, что MyClass
выглядит следующим образом:
public class MyClass
{
private ITimer timer;
public MyClass(ITimer timer)
{
this.timer = timer;
this.timer.Elapsed += TimerElapsedHandler;
}
public bool ReceivedEvent { get; set; }
private void TimerElapsedHandler(object sender, ElapsedEventArgs e)
{
ReceivedEvent = true;
}
}
В тесте мы заставляем таймер поднять, когда нам это нужно, и проверяем, выполнен ли код в TimerElapsedHandler
, утверждая,ReceivedEvent
свойство было установлено.В действительности, этот метод может сделать больше, но это изменит только то, как мы делаем утверждения - идея остается прежней.
Редактировать: Вы также можете попробовать Кроты , фреймворк, который позволяет генерировать подделок любых типов / методов фреймворка.Однако, если бы таймер насмешки был всем, что вы хотели, я бы использовал подход обертки.