타이머 클래스를 만들고 있지만 테스트를 통과 할 수 없습니다. timer의 시간이 경과 할 때 메서드가 호출되는지 테스트하고 싶습니다. MOQ를 사용하여Moq를 사용하여 타이머 테스트
public class TimeOutTimer
{
private readonly ISubscriber _subscriber;
private Timer _timer;
public TimeOutTimer(ISubscriber subscriber)
{
_subscriber = subscriber;
}
public void Start()
{
_timer = new Timer(1000);
_timer.Start();
_timer.Elapsed += TimerOnElapsed;
}
private void TimerOnElapsed(object sender, ElapsedEventArgs elapsedEventArgs)
{
_subscriber.TimeReached();
}
}
그리고 시험 :
나는 다음과 같은 클래스가
[Test]
public void Start_WithValidParameters_TriggersTimeReached()
{
var subscriberMock = new Mock<ISubscriber>();
var timer = new TimeOutTimer(subscriberMock.Object);
timer.Start();
subscriberMock.Verify(subscriber => subscriber.TimeReached());
}
나는 타이머를 꺼내 _subscriber.TimeReached()에 직접 전화를 걸 경우를 공장.
내가 잘못 했나요?
_subscriber.TimeReached()는 테스트를 통해 디버깅하는 경우에 들어갑니다. 구독자가 조롱을당한 이후로 추측하지는 않습니다. – Adam
TimerOnElapsed가 호출되지 않습니다. 타이머가 작동하려면 어떻게 든 시험 대기해야합니까? Hmmmm ..... – Dante
그러나 질문에 대한 응답으로 _subscriber.TimeReached()를 Elapsed 이벤트없이 직접 호출하면 예상대로 작동하고 Verify는 조롱 된 인터페이스 메서드에 대한 호출이 완료되었음을 확인합니다. – Dante