如何在jasmine-node测试中窥探全局定时器,如clearInterval或setInterval?

时间:2016-04-26 15:39:46

标签: node.js jasmine jasmine-node

我正在使用nodejs中的服务器端代码编写测试。测试是用茉莉花2编写的。我正在使用grunt-jasmine-nodejs运行测试。

服务器端代码使用setInterval和clearInterval等定时器。我想监视这些计时器,看看这些计时器是否被调用。

服务器端代码 - server.js

exports.socketHandler = function(socket){    
...
getResultsInterval = setInterval(getResults, INITIAL_POLL, onResults);    
getResultsTimeout = setTimeout(function() {               
              clearInterval(getResultsInterval);          
            }, 1 * 60 * 1000);
}

测试

var server = require("../../server");
describe('Test the Server', function(){

beforeEach(function(done)){
....
done();
}

 it ('should be able to clear timers', function(done){
spyOn(global, 'setInterval');
spyOn(global, 'clearInterval');

server.socketHandler(socket);

expect(global.setInterval).toHaveBeenCalled();
expect(global.clearInterval).toHaveBeenCalled();

}

测试失败并显示消息 -

  

错误:已调用的spy setInterval已被调用。   错误:已调用间谍clearInterval。

但是全局对象具有setInterval方法。

任何帮助都将不胜感激。

由于

1 个答案:

答案 0 :(得分:0)

我不能因此而受到赞誉,但当我问了类似的东西时,我得到了这个答案;

beforeEach(function() {
  timerCallback = jasmine. createSpyObj("setInterval");
  jasmine.clock().install();
});

afterEach(function() {
  jasmine.clock().uninstall();
});

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

  expect(setInterval).not.toHaveBeenCalled();

  jasmine.clock().tick(1001);

  expect(setInterval).toHaveBeenCalled();
});