我正在阅读Manuel Kiessling的Node Craftsman,在关于事件发射器的章节中,他提供了以下Jasmine测试规范
it('should fire a "grew" event when the file grew in size', function(done) {
var path = '/var/tmp/filesizewatcher.test';
exec('rm -f ' + path + ' ; touch ' + path, function() {
watcher = new FilesizeWatcher(path);
watcher.on('grew', function(gain) {
expect(gain).toBe(5);
done();
});
exec('echo "test" > ' + path, function() {});
});
});
我知道我们必须触发done()
告诉Jasmine事件确实已经触发并执行使用it()
注册的回调
我不明白的是,当触发观察者exec
事件所需的grew
语句位于依赖于{的另一个回调内时,代码是如何达到的? {1}}被执行。我尝试将done
移出内部回调和测试时间,我不明白为什么。难道我们不需要这部分与实际开始发生的任何事情同步吗?
帮助我摆脱程序上的束缚!我很困惑,我的问题甚至让我感到困惑。
答案 0 :(得分:0)
好的,我把这一切都倒退了,我对作者的解释感到困惑。
Jasmine使用expect
和匹配器来评估测试是否通过,从而完成测试。测试异步函数(如事件发射器)要求我们让Jasmine知道测试何时实际完成,因此需要done()
。在这种情况下,Jasmine回调到it()
并不需要启动,而是完成执行规范。
来自Jasmine docs:
在完成调用后,此规范才会完成。
默认情况下,jasmine将等待异步规范5秒 在导致超时失败之前完成。如果超时到期之前 调用完成后,当前规范将被标记为失败和套件 执行将继续,就像调用完成一样。