gpt4 book ai didi

.net - .NET 中的单元测试 System.Threading.Timer

转载 作者:行者123 更新时间:2023-12-02 03:55:19 24 4
gpt4 key购买 nike

如何在.NET中基于System.Threading.Timer对计时器进行单元测试System.Threading.Timer有一个回调方法

最佳答案

您可以通过不实际创建对 System.Threading.Timer 的直接依赖项来对其进行单元测试。相反,创建一个 ITimer 接口(interface),以及一个实现该接口(interface)的 System.Threading.Timer 包装器。

首先,您需要将回调转换为事件,以便它可以成为接口(interface)的一部分:

public delegate void TimerEventHandler(object sender, TimerEventArgs e);

public class TimerEventArgs : EventArgs
{
public TimerEventArgs(object state)
{
this.State = state;
}

public object State { get; private set; }
}

然后创建一个接口(interface):

public interface ITimer
{
void Change(TimeSpan dueTime, TimeSpan period);
event TimerEventHandler Tick;
}

还有一个包装器:

public class ThreadingTimer : ITimer, IDisposable
{
private Timer timer;

public ThreadingTimer(object state, TimeSpan dueTime, TimeSpan period)
{
timer = new Timer(TimerCallback, state, dueTime, period);
}

public void Change(TimeSpan dueTime, TimeSpan period)
{
timer.Change(dueTime, period);
}

public void Dispose()
{
timer.Dispose();
}

private void TimerCallback(object state)
{
EventHandler tick = Tick;
if (tick != null)
tick(this, new TimerEventArgs(state));
}

public event TimerEventHandler Tick;
}

显然,您可以从 Threading.Timer 添加您需要使用的构造函数和/或 Change 方法的任何重载。现在,您可以使用假计时器对依赖于 ITimer 的任何内容进行单元测试:

public class FakeTimer : ITimer
{
private object state;

public FakeTimer(object state)
{
this.state = state;
}

public void Change(TimeSpan dueTime, TimeSpan period)
{
// Do nothing
}

public void RaiseTickEvent()
{
EventHandler tick = Tick;
if (tick != null)
tick(this, new TimerEventArgs(state));
}

public event TimerEventHandler Tick;
}

每当您想要模拟刻度时,只需在假对象上调用 RaiseTickEvent 即可。

[TestMethod]
public void Component_should_respond_to_tick
{
ITimer timer = new FakeTimer(someState);
MyClass c = new MyClass(timer);
timer.RaiseTickEvent();
Assert.AreEqual(true, c.TickOccurred);
}

关于.net - .NET 中的单元测试 System.Threading.Timer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2367417/

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