javascript - 在 PhantomJS 中使用 Jasmine 测试 $interval

标签 javascript jasmine phantomjs

看来我的interval 从未被触发。

我有一个包含 $interval 的指令,我想测试它。我删除了所有与指令相关的代码,并在其 Controller 中添加了以下代码:

window.called = 0;
window.interval = $interval(function () {
    window.called++;
    console.log('interval ' + window.called); // 4
}, 10);
console.log('initialized'); // 1

测试看起来像这样:

describe('myDirective', function () {
    beforeEach(module('myModule'));
    beforeEach(function($compile, $rootScope) {
        /* ... compile element in its own scope ... */
    });
    it('should run the interval', function () {
        console.log(window.interval); // 2
        waitsFor(function () {
            console.log('tick'); // 3
            return false;
        }, 1000);
    });
});

这是一个愚蠢的测试。 waitsFor 方法实际上一直返回 false,用于调试目的。但这就是我在控制台中看到的全部内容:

initialized // 1
Object: {then: ..} // 2
tick // 3
tick // 3
tick // 3
tick // 3
..

最终测试失败。我从未在日志中看到单个 interval。一般而言,我的代码有什么问题吗?还是我遗漏了 Jasmine/PhantomJS 的某些特定内容?

最佳答案

$interval 在 angular-mocks 中有一个模拟实现。 确保您使用的是与您的 Angular 版本相匹配的 Angular 模拟版本。

模拟版本的 $interval 有一个 flush 方法来控制刻度。 参见 ngMock.$interval

查看此 fiddle带有演示:

//--- CODE --------------------------
angular.module('myModule', []).service('myModuleService', ['$interval', function ($interval) {
    var called = 0;
    $interval(function () {
        called++;
    }, 10);
    this.getCalled = function () {
        return called;
    }
}]);

// --- SPECS -------------------------

describe('test $interval', function () {

    it('calls the interval callback', function () {
        var service, $interval;
        angular.mock.module('myModule');
        angular.mock.inject(function (myModuleService, _$interval_) {
            // Initialize the service under test instance
            service = myModuleService;
            $interval = _$interval_;
        });
        expect(service.getCalled()).toEqual(0);
        $interval.flush(11);
        expect(service.getCalled()).toEqual(1);
        $interval.flush(10);
        expect(service.getCalled()).toEqual(2);
    });
});

关于javascript - 在 PhantomJS 中使用 Jasmine 测试 $interval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994013/

相关文章:

javascript - HTML Checkbox Click() 使用 jQuery 返回 FALSE 或 TRUE,而不是 READONLY 或 DISABLED

angularjs - Angular - Jasmine 可以执行真正的 XHR 吗?

JavaScript 单元测试或端到端测试

node.js - 幻影 JS + Docker : html font-family is not respected when converting from HTML

javascript - 单击主自定义复选框打开一个复选框组

javascript - OnClick - 防止用户多次提交

php - Firefox4/5 不运行使用 HTML_AJAX pear 库附加到 AJAX 响应的 JS

angularjs - JasmineReporters JUnitXmlReporter 不写入文件

visual-studio-2013 - Chutzpah 测试适配器在哪里安装 PhantomJS?

javascript - 尽管在测试期间发现错误,但测试结果成功