Q.delay不使用Q promise库和Jasmine时钟?

时间:2016-02-03 16:01:27

标签: javascript asynchronous jasmine q

我使用Q进行了非常基本的Jasmine测试,但它似乎并没有起作用。我只是使用Jasmine模拟时钟并尝试使用Q.delay,我认为它使用了引导时的setTimeout。

我有一些更复杂的测试涉及从Q promise的setTimeout()处理程序调用{​​{1}},而且似乎也没有用,但我认为这会使一个更简单的测试用例,可以在Stack Overflow上发布。

这是我非常简单的测试用例:

then

(此测试基于类似SO问题中的测试用例:Jasmine clock tick & Firefox: failing to trigger a Q.delay method

当我运行测试时,它无法说 it('clock test', function() { jasmine.clock().install(); var foo = null; Q.delay('hi', 10000).then(function(arg) { console.log('foo'); foo = arg; }); jasmine.clock().tick(10010); expect(foo).toEqual('hi'); jasmine.clock().uninstall(); }); Expected null to equal 'hi'.从未执行过。

要查看Q或其他问题是否存在,我尝试在规范中添加一个简单的console.log调用:

setTimeout

这有效 - setTimeout(function() { console.log("bar"); }, 10000); 在调用bar后打印到控制台。

卸载Jasmine时钟后,正常时钟启动,等待10秒后,jasmine.clock().tick打印出来。

任何人都知道发生了什么?

3 个答案:

答案 0 :(得分:1)

您要求它以同步方式执行异步。别。尝试使用Jasmine的异步,然后使用时钟。

it('clock test', function(done) {
    var foo = null;
    Q.delay('hi', 10000).then(function(arg) {
      console.log('foo');
      foo = arg;
      expect(foo).toEqual('hi');
      done();
    });
  }, 15000);

答案 1 :(得分:1)

  

任何人都知道发生了什么?

可能Q对Promises/A+ spec中给出的异步保证很认真。因此,即使setTimeout比预期更早执行,也没有理由突然同步调用then回调。在承诺履行完毕后,它仍然需要等待。

另一种解释是Q在其模块初始化过程中获取了setTimout的私有副本,以防止内置的这种混乱。它不是调用全局函数,而是使用它对旧函数的内部引用,而不受jasmine.clock()的影响。

答案 2 :(得分:0)

您可以窥探Q.delay并避免让您的测试等待给定的延迟:

describe('Q.delay', function() {
    it('should call Q.delay', function(done) {
        spyOn(Q.makePromise.prototype, 'delay').and.returnValue(function() {
            return this;
        });
        Q('A resolve value').delay(3000).then(done);
        expect(Q.makePromise.prototype.delay).toHaveBeenCalledWith(3000);
    });
});