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

2023-11-22

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


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

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

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

然后创建一个接口:

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

显然你会添加构造函数和/或的任何重载Change您需要使用的方法Threading.Timer。现在您可以对任何内容进行单元测试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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

.NET 中的单元测试 System.Threading.Timer 的相关文章

随机推荐

  • 为什么使用 C++ Typedef?

    我对 typedef 的理解是给一个声明一个别名 这样的 int 声明现在将被称为 Integer 但为什么 为什么有人会使用 typedef 更有利的原因是什么 typedef int Integer Integer blamo 50 c
  • C++ 中的粗体输出

    我正在构建一本字典 当我打印 输出 单词定义时 我想以粗体打印单词本身 当我打印时 cout lt
  • 您可以通过 Flex 使用 Amazon S3 吗?

    由于缺少 clientaccesspolicy xml 通过 Flex 使用 Amazon S3 似乎存在问题 有什么解决办法吗 Edit 下面的两个答案都很棒并且有效 我都赞成 我不会为这个问题指定答案 因为它们都有效 您可以通过 Fle
  • 在 VB 中键入时,如何使智能感知上的 Enter 键的反应方式与 Visual Studio 中的 C# 中的反应方式相同?

    我使用的是 Visual Studio 2008 并且习惯了 C 当智能感知弹出时 我通过按 Enter 键选择我想要的内容 它不会跳到下一行 在 VB 中 当我在智能感知上按下回车键时 我会跳转到下一行 有谁知道这个智能感知选项的设置可能
  • 是否可以在 Emacs 中用文本替换边缘位图?

    我很想用简单 雅致的文本 甚至可能是一个很好的 unicode 字符 例如 u2026省略 这可能吗 不它不是 边缘 位图 实际上是位图 即覆盖在边缘上的 0 1 位向量 没有办法直接将任意 unicode 字符渲染到边缘上 您可以做的就是
  • IN 子句中的通配符

    SQL 我想在 IN 子句中使用通配符 但没有得到我期望的结果 我的查询是这样的 SELECT DISTINCT ID FROM INST WHERE TYPE in IP International 请帮助解决这个问题 解决方案应该是使用
  • Python for 循环中的“pass”和“continue”有区别吗?

    两个Python关键字之间有什么显着差异吗continue and pass就像例子中一样 for element in some list if not element pass and for element in some list
  • 可以改变JButton的形状吗?

    是否可以将 JButton 的形状从矩形更改为圆形 Sean Cogan 提供的链接就是您所需要的 如果您想要简短 请设置一个图像 圆形或任何您希望按钮看起来相似的形状 使用setIcon然后在 JButton button1 上设置这些值
  • 获取类转换异常,其中两个类完全相同

    我正在做一个 JBoss SEAM 项目 当我查看表单时 我收到此错误 java lang ClassCastException it cogitoweb csi entity csiorelav CsiTipoLav cannot be
  • Unix 域:connect():没有这样的文件或目录

    如标题所述 我的连接 调用具有相应地址的 unix 域类型套接字会导致错误ENOENT 没有这样的文件或目录 两个套接字已正确初始化 并且相应地创建并绑定了套接字文件 服务器和客户端套接字在不同的进程中运行 尽管客户端进程是 fork 和
  • 使用标记列表构建抽象语法树

    我想从令牌列表构建 AST 我正在制作一种脚本语言 并且已经完成了词法分析部分 但我不知道如何创建 AST 所以问题是 我该如何采取这样的事情 WORD int WORD x SYMBOL NUMBER 5 SYMBOL 并将其转换为抽象语
  • GWT - 在单元树中添加和删除节点

    这里我有一个完整且非常简单的示例来动态添加 删除 单元树的节点 我的例子效果不太好 似乎有 是刷新问题 只有关闭 展开节点才会显示正确的 结果 我在这个论坛上也没有找到适合这个问题的答案 也许有人可以尝试我的例子并告诉我问题出在哪里 任何其
  • 在一个 JFrame 中使用两个 JPanel

    我正在尝试创建一个程序 允许用户单击按钮将某些内容放入JPanel并允许他们移动该物品 我已经找到了一个很好的布局来允许移动组件 请参阅this关联 但是 我只是好奇创建这样的布局的最佳方法 我的希望是有这样的东西 我怎样才能做到这一点 我
  • Python 读取输入的最快方法

    我想读取一个包含整数列表列表的巨大文本文件 现在我正在执行以下操作 G with open test txt r as f for line in f G append list map int line split 然而 大约需要 17
  • 实时更新 Google Compute Engine 实例类型

    我想知道您是否可以将一个实例的类型更改为另一种实例 例如 n1 标准 1 到 n1 标准 2 我在文档中没有看到任何内容 但可能我错过了一些东西 如果这是不可能的 我如何处理这个问题 还有另一种方法可以进行此更改 您可以停止机器 对其进行编
  • AngularJS ngTable 按日期过滤

    我正在尝试在我的应用程序中设置 ngTable 但它不支持按日期过滤 而且我不知道如何实现它 我最初将数据中的日期作为时间戳 这使我能够由于时间戳的增量性质而对列进行正确排序 但显然我无法输入 9 月并过滤数据 Example row da
  • 两个文本文件的内连接

    希望对两个不同的文本文件执行内部联接 基本上我正在寻找与 GNU join 程序等效的内部联接 这样的事情存在吗 如果没有 则awk or sed解决方案将是最有帮助的 但我的第一选择是 Linux 命令 这是我想要做的事情的一个例子 fi
  • 在应用程序购买恢复交易中,我无法弄清楚代码

    我在我的编码中添加了应用程序内购买 它在购买时运行良好 但当我尝试在删除并再次安装应用程序时添加 Restore Transaction 代码时 它会出现错误并且应用程序关闭 我添加了以下编码 在 onCreate 我写的 startSer
  • MySQL 创建外键的语法

    创建外键时这种语法是否正确 create table department departmentID int not null auto increment primary key name varchar 30 type InnoDB c
  • .NET 中的单元测试 System.Threading.Timer

    如何在 NET中基于System Threading Timer对计时器进行单元测试 System Threading Timer有一个回调方法 您可以通过不实际创建直接依赖项来对其进行单元测试System Threading Timer