angularjs - 如何使用 jasmine 测试 $timeout 操作的持续时间?

标签 angularjs jasmine

假设我在指令中具有以下匿名功能:

 $timeout(function () {
     element.removeClass('highlighted')
 }, 2000)   

这工作成功。现在,如果我想使用 jasmine 编写一个测试,以确保在 ~2s 后删除该类,这将如何完成?

我应该补充一点,我曾尝试同时使用 jasmine.ClockwaitsFor到目前为止,在这两种情况下,测试都失败了。但是,值得注意的是,当我更改 $timeout 时至 setTimeout在我的指令中,两个测试都通过了,所以 angular 的行为似乎在这里起作用。

(注意这里使用 $timeout.flush() 不能令人满意,因为它只能证明超时完成,而不是用了多长时间)。

最佳答案

从 1.2 开始 $timeout.flush() 采用一个延迟参数来模拟类似于 jasmine.Clock 的时钟的模拟,但在某种程度上使 Angular $timeout 感到高兴。

所以这个测试会通过:

it("timeout test", function() {
    $timeout(function() {
        timerCallback();
    }, 100);
    expect(timerCallback).not.toHaveBeenCalled();
    $timeout.flush(99);
    expect(timerCallback).not.toHaveBeenCalled();
    $timeout.flush(1);
    expect(timerCallback).toHaveBeenCalled();
});

demo fiddle

关于angularjs - 如何使用 jasmine 测试 $timeout 操作的持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21272376/

相关文章:

javascript - 使用 ng-keyup 在 angularjs 中搜索对 mysql 的查询,但仅在 3 秒后 $http

javascript - 类型错误 : module is not a function AngularJS & Jasmine

angular - 如何在测试 angular2 组件时模拟可观察流?

angular - NullInjectorError : StaticInjectorError(DynamicTestModule)[ErrorHandlerInterceptor -> Router]:

javascript - 没有使用 jasmine.js 和 sinon.js 调用backbone.js 点击事件 spy

javascript - AngularJS html 5 模式

angularjs - 无限滚动不启用滚动首先导致 Angular js

javascript - 使用指令更新 ng-repeat 创建的图像

angular - Angular 2/Jasmine 测试中的 testbed.get 和 inject 有什么区别?

javascript - Chrome-Extensions Jasmine 测试,未识别 Chrome、onMessage 请求方法