我使用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
打印出来。
任何人都知道发生了什么?
答案 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);
});
});