Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/405.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在PhantomJS中使用Jasmine测试$interval_Javascript_Jasmine_Phantomjs - Fatal编程技术网

Javascript 在PhantomJS中使用Jasmine测试$interval

Javascript 在PhantomJS中使用Jasmine测试$interval,javascript,jasmine,phantomjs,Javascript,Jasmine,Phantomjs,我的间隔似乎从未触发 我有一个指令,它包含一个$interval,我想测试它。我已经删除了所有与指令相关的代码,并在其控制器中添加了此代码: window.called = 0; window.interval = $interval(function () { window.called++; console.log('interval ' + window.called); // 4 }, 10); console.log('initialized'); // 1 测试如下

我的
间隔
似乎从未触发

我有一个指令,它包含一个
$interval
,我想测试它。我已经删除了所有与指令相关的代码,并在其控制器中添加了此代码:

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
..

最终测试失败了。我从未在日志中看到一个
间隔。我的代码总体上有什么问题吗?还是我缺少Jasmine/PhantomJS的某些特殊功能?

$interval在angular mock中有一个模拟实现。 确保您使用的角度模拟版本与您的角度版本相匹配

$interval的模拟版本有一个flush方法来控制滴答声。 看

请看下面的演示:

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

我想补充一点,如果我将
$interval()
替换为
setInterval()
,它将按预期工作,因此此问题是
$interval()
所特有的。