如何在 karma angularjs 中对 setInterval 进行单元测试

2024-03-12

app.directive('shuffleBlocks', function($timeout){
    return {
        link: function(sco,ele,att){
            if (itemCnt <= 1) return;

            /*Trigger function*/
            function triggerEvent(){
                ...
            }
            ele.bind('click', triggerEvent);

            setInterval(triggerEvent, 5000);
        }
    }
})

我在这里写了测试

        var elem = '<div shuffle-blocks><div>';
        elem = mockCompile(elem)(rootScope.$new());
        setInterval(function(){
            expect(......).toBe(....)
        });

显然这不是正确的方法 有谁知道如何在业力中测试 $timeout 和 setInterval ?


UPDATE:在 Angular 1.2+ 应用程序中模拟 setInterval 的正确方法是使用 Angular 的$interval服务。使用$interval服务提供了许多好处,但在这种情况下最常用的一个是$interval.flush()方法。编写测试时,$interval暴露了一个.flush()方法允许你模拟 JS 时钟。

app.directive('shuffleBlocks', function($timeout, $interval){
    return {
        link: function(sco,ele,att){
            if (itemCnt <= 1) return;

            /*Trigger function*/
            function triggerEvent(){ ... }
            ele.bind('click', triggerEvent);

            $interval(triggerEvent, 5000);
        }
    }
});

然后在你的单元测试中:

var elem = '<div shuffle-blocks><div>';
elem = mockCompile(elem)(rootScope.$new());
$interval.flush(5000); // flush accepts the # of ms to be flushed
expect(......).toBe(....);

希望这对将来查找此答案的人有所帮助。我将为那些仍在使用 1.1X 的人留下我之前的答案。


上一个答案:根据茉莉花文档 http://jasmine.github.io/1.3/introduction.html#section-Jasmine_Clock,你应该能够使用jasmine.Clock.useMock()函数来模拟典型的 JavaScript 时钟并手动完成时间间隔。由于 Angular 只是包装了原生setTimeout功能,我非常肯定它应该允许它工作,尽管我还没有测试过它。

1.3 版本的 jasmine 文档是here http://jasmine.github.io/1.3/introduction.html#section-Mocking_the_JavaScript_Clock。这是演示其工作原理的代码示例。

beforeEach(function() {
    timerCallback = jasmine.createSpy('timerCallback');
    jasmine.Clock.useMock();
});

it("causes a timeout to be called synchronously", function() {
    setTimeout(function() {
        timerCallback();
    }, 100);

    expect(timerCallback).not.toHaveBeenCalled();

    jasmine.Clock.tick(101);

    expect(timerCallback).toHaveBeenCalled();
});

我看到的唯一问题是你的triggerEvent()函数是您的链接函数的本地函数,所以我不知道您如何能够访问它来模拟它。但希望这能为您指明正确的方向。如果没有,抱歉,我试过了。

UPDATE:模拟时钟的语法已更改Jasmine 2.0。如果您使用的是 2.0,请参阅更新的文档here http://jasmine.github.io/2.0/introduction.html#section-Mocking_the_JavaScript_Timeout_Functions.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 karma angularjs 中对 setInterval 进行单元测试 的相关文章

随机推荐

  • jQuery Mobile - 无法将 pagebeforechange 绑定到页面 id?

    我只能将 pagebeforechange 绑定到整个 jquery mobile 文档 而不是单个页面 谁能解释为什么this http jsfiddle net kenw232 HYzYJ 不起作用 div data role page
  • 什么算作解析请求?

    由于条款的更改 Parse 现在限制了每秒的请求数量 这是一件好事 但是 Parse Push 和 Parse Analytics 算作请求吗 每当您通过 iOS Android JavaScript Windows Xamarin Uni
  • 在非 Metro 应用程序中使用自定义 Windows 运行时组件

    想象一个场景 您有一个复杂的 WinRT 代码框架 您希望从 C Metro 应用程序和 C 桌面应用程序访问该框架 有没有办法将 WinMD 包含在非 Metro 应用程序中 UPDATE 这仅适用于 Windows 8 Microsof
  • 在 C# 中将数据表转换为 JSON

    我想将记录从数据库获取到DataTable 然后转换DataTable转换为 JSON 对象 将 JSON 对象返回到我的 JavaScript 函数 I use this https stackoverflow com questions
  • phpMyAdmin + CentOS 6.0 - 禁止

    当我想访问我的 phpMyAdmin 时 我总是收到此消息 w3m localhost phpmyadmin Forbidden You don t have permission to access phpmyadmin on this
  • 从 angularjs 指令触发点击事件

    如何触发 li 元素的点击事件 并从 angularjs 指令指定其索引 我尝试使用 first 来触发第一个元素的点击 但它不起作用 谢谢你的帮助 这也许是您实现这一目标的另一种方法 将索引和项目传递给指令 并让指令在模板中设置 html
  • 解构神奇宝贝故障?

    如果这是问这个问题的错误地方 我深表歉意 我认为这肯定与编程相关 但如果这属于其他网站 请告诉我 我从小就玩神奇宝贝红和蓝 这些游戏非常有趣 但因存在许多可利用的故障而臭名昭著 例如 请参阅这个游戏的荒谬的速通 http www youtu
  • 从一组 ActiveX 选项按钮返回索引值

    首先我要声明我是一名医学生 而不是程序员 我编写了一个电子表格 可以作为包含 50 个问题的考试 每个问题都有 15 个多项选择答案 我使用 ActiveX 选项按钮将其分组到每个问题编号 我使用 Activex 而不是表单选项按钮 因为我
  • Java导入会很慢吗? [复制]

    这个问题在这里已经有答案了 import package 比 import package MyClass 慢吗 如果是 在哪种情况下 运行时还是编译 import package 编译时可能会更慢 如果该包中定义了很多东西 它也会降低 I
  • CSS 背景精灵对于 iPhone 来说太大

    我有一个用于 css 背景的精灵表 尺寸为 2000x2000 像素 在所有桌面浏览器中都可以正常工作 但在 iPhone 版 Safari 上则完全不渲染 将尺寸降低到 1000x1000 可以完美渲染 好吧 除了我现在错过了精灵表的四分
  • 如何设置jquery按钮的活动状态

    我有一个使用 jquery 按钮的正确导航 如果用户点击它 页面就会加载 我需要的是 一旦页面重新加载 按钮应该显示它已被选中 如何使用 jquery 按钮执行此操作 为什么不使用 jQuery UI Tab 小部件 您也可以尝试使用按钮集
  • DataGridView:仅当滚动到底部时自动向下滚动

    我有一个程序 它使用 dataGridView 来显示通过向 dataGridView 添加行来每秒自动更新的数据 当我想在开头阅读一些内容时 我会向上滚动 即使数据更新 滚动条也不会向下滚动 这很好 但我希望滚动条仅在位于 dataGri
  • 如何在 LibreOffice 中运行 python 宏?

    当我去工具 gt 宏 gt 组织宏 gt Python我得到这个对话框 It is 不可能创建新的 Python 宏 显然 LibreOffice 有没有Python编辑器所以我必须在其他地方编写宏 然后执行它们 但是我不知道where放置
  • 我不断收到此错误:“阅读器关闭时调用 Read 的尝试无效”

    这是我的代码 我关闭并打开阅读器 但它仍然无法工作 几个线程可以同时访问这个函数 但是有一个锁 它一开始会工作几次 但迟早我会收到异常 阅读器关闭时调用 Read 的尝试无效 private IList
  • 在 El Capitan 10.11.6 上安装 Tensorflow 1.10

    我试图在我的旧Mac上安装tensorflow 1 10 但每次都会遇到同样的问题 一旦我启动 python shell 我就会收到以下错误 我确实尝试先将其安装在 virtualenv 中 之后 我尝试仅使用 pip 安装它并得到相同的错
  • Tempus Dominus Bootstrap4 需要 moment.js。 (日期时间选择器)

    我正在尝试使用 Tempus Dominus Bootstrap4 添加 DateTimePicker 但我收到以下错误 I use Laravel as a front end So I use laravel mix 我的刀片文件在下面
  • .htaccess 重写规则中的模式干扰

    在 htaccess 中定义重写规则时 我遇到了模式干扰问题 我试图重写的网站链接是 example com item work gt example com work example com item work tile x gt exa
  • 使用 ActiveAdmin 进行多步骤表单?

    是否可以使用 ActiveAdmin 创建多步骤表单 如果没有 是否可以在提交表单后添加另一个重定向到的页面 不是默认索引 显示或表单页面 我自己也一直在苦恼这个问题 我发现您可以使用 ActiveAdmin 文件中的集合操作添加自己的页面
  • Gwt 2.8-rc1 超级开发模式不适用于 IntelliJ IDEA 2016.2.5

    我的项目在超级开发模式下使用 GWT 2 7 和 2 8 beta1 正确启动 不幸的是 自 2 8 rc1 发布以来 它没有启动 看起来 GWT 项目依赖项配置不正确 IDE IntelliJ IDEA 2016 2 5 C Progra
  • 如何在 karma angularjs 中对 setInterval 进行单元测试

    app directive shuffleBlocks function timeout return link function sco ele att if itemCnt lt 1 return Trigger function fu