Поскольку интервал таймера известен, вы можете подождать установленное время и посчитать, сколько раз таймер вызвал Foo
.
Например
[TestMethod]
public async Task MainClass_Should_Stop() {
//Arrange
var dependency = Substitute.For<IDependency>();
var subject = new MainClass(dependency);
var expectedDelay = 200;
var expectedCalls = 2;
//Act
subject.Start();
await Task.Delay(expectedDelay);
subject.Stop();
await Task.Delay(100);
//Assert
dependency.Received(expectedCalls).Foo();
}
В то время как вышеупомянутое использует NSubstitute, то же самое может быть применено с вашей системой выбора насмешки.
Если бы я изменил ожидаемую задержку на такую, из-за которой ожидаемые звонки могли бы отличаться, тогда тест не прошел бы.
Например, если задержка установлена на 100 мс, а вызовы остаются на 2, то произойдет сбой, потому что произошел бы только один вызов.