我有一个Angular服务,它执行一些异步操作(基于定时器)。其中一件事是你可以使用计时器定义一个“处理程序”,当计时器到期时它会触发(如下面的伪代码):
flag = false;
timer = new Timer(1000); // ms
timer.handler = function () { flag = true };
在这种简单情况下,计时器将在1秒后将标志设置为true。如何使用Angular / Karma / Jasmine进行单元测试?
从阅读文档中,我本以为以下内容可以正常工作:
...
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
sleep(2)
expect(flag).toBe(true);
...
与道德无关,该测试由于以下原因未通过:
ReferenceError: Can't find variable: sleep
经过一些阅读,显然我不能在Jasmine中使用angular-scenario。好的,我接受了这个事实。
更新:根据评论,我测试了我的“工作中”的settimeout方法。它从未被调用。
所以这个可以工作:
...
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
setTimeout(function () { expect(flag).toBe(true) }, 2000);
...
但感觉有点奇怪。
问题:有更好的方法吗?
趣闻:是的,我知道$timeout。我在代码深处进行了一些非常充分的原因,远离白天的光芒 =)