【发布时间】:2014-01-15 19:52:14
【问题描述】:
我有一个 Angular 服务,它执行一些异步操作(基于计时器)。您可以使用计时器做的一件事是定义一个“处理程序”,在计时器到期时触发(如本伪代码中所示):
flag = false;
timer = new Timer(1000); // ms
timer.handler = function () { flag = true };
在这种简单的情况下,计时器会在 1 秒后将 flag 设置为 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
经过一番阅读,显然我不能将 angular-scenario 与 Jasmine 一起使用。好的,我对此很满意。
更新:根据 cmets,我测试了我的“工作”settimeout 方法。它永远不会被调用。
所以这行得通:
...
flag = false;
timer = new Timer(1000);
timer.handler = function () { flag = true };
expect(flag).toBe(false);
setTimeout(function () { expect(flag).toBe(true) }, 2000);
...
但是感觉有点怪。
问题:有更好的方法吗?
有趣的琐事:是的,我知道 $timeout。我有很好的理由(TM)做我在代码矿深处所做的事情,远离白天=)
【问题讨论】:
-
为什么标准超时感觉怪怪的?
-
如果你使用 $timeout 你可以调用 $timeout.flush();有了这个,您可以测试前定时器条件和后定时器条件。但你不想要它:)
-
@rdodev: 嗯,我不知道这是否是以前感觉怪异的原因,但我刚刚测试过,超时内的 expect() 实际上并没有被调用(我设置了时间到 10 秒并重新运行测试,但它几乎立即完成)。
-
@Michael:我的计时器有一个等效于 flush() 的方法,但这不是我想要测试的。
-
在你上一个代码 sn-p 中,Timer() 什么时候被触发?在实例化时?
标签: unit-testing angularjs asynchronous jasmine karma-runner