这个Jasmine测试代码是如何工作的?

时间:2015-11-17 20:20:57

标签: javascript callback jasmine

我正在阅读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移出内部回调和测试时间,我不明白为什么。难道我们不需要这部分与实际开始发生的任何事情同步吗?

帮助我摆脱程序上的束缚!我很困惑,我的问题甚至让我感到困惑。

1 个答案:

答案 0 :(得分:0)

好的,我把这一切都倒退了,我对作者的解释感到困惑。

Jasmine使用expect和匹配器来评估测​​试是否通过,从而完成测试。测试异步函数(如事件发射器)要求我们让Jasmine知道测试何时实际完成,因此需要done()。在这种情况下,Jasmine回调到it()并不需要启动,而是完成执行规范。

来自Jasmine docs

  

在完成调用后,此规范才会完成。

     

默认情况下,jasmine将等待异步规范5秒   在导致超时失败之前完成。如果超时到期之前   调用完成后,当前规范将被标记为失败和套件   执行将继续,就像调用完成一样。