gpt4 book ai didi

c# - 用最小起订量测试定时器

转载 作者:行者123 更新时间:2023-12-02 05:28:26 25 4
gpt4 key购买 nike

我正在构建一个计时器类,但无法通过测试。我想测试当计时器上的时间结束时是否调用了一个方法。

我有以下类(class):

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();
}
}

测试,使用 Moq:

[Test]
public void Start_WithValidParameters_TriggersTimeReached()
{
var subscriberMock = new Mock<ISubscriber>();
var timer = new TimeOutTimer(subscriberMock.Object);

timer.Start();

subscriberMock.Verify(subscriber => subscriber.TimeReached());
}

如果我取出 Timer 并直接调用 _subscriber.TimeReached(),它会起作用。

我做错了什么吗?

最佳答案

在您的示例中,事件应在 1000 毫秒后调用,而您会立即进行验证。显然,此时无法调用该事件。

最简单的方法是在测试中让线程休眠。

[Test]
public void Start_WithValidParameters_TriggersTimeReached()
{
var subscriberMock = new Mock<ISubscriber>();
var timer = new TimeOutTimer(subscriberMock.Object);

timer.Start();
Thread.Sleep(1000);

subscriberMock.Verify(subscriber => subscriber.TimeReached());
}

然而,这并不是为基于时间的类生成单元测试的真正正确方法。

正确的方法是创建一个 ITimer 接口(interface),然后由基于 Timer 的适配器实现。

ITimer 然后成为 TimeoutTimer 的依赖项,并在构造函数中或作为属性传递给它。

然后在您的测试中,您可以模拟计时器,使其无需等待即可与您的测试同步(例如,通过控制类来手动触发事件)。

关于c# - 用最小起订量测试定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12753373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com