2014-08-29 47 views
0

我试图把一个小例子展示给同事,但不知道这个测试that I've put in a gist有什么问题。这个单元测试异步JavaScript函数(通过Mocha/Sinon)有什么问题?

基本上我想测试做了异步功能,但使用兴农的间谍()功能,以确保它完成:采用摩卡和done()来解决一个测试,依赖于

function asyncHello(name, delay, cb) { 
    setTimeout(function() { 
    console.log("running after ", delay); 
    cb("hello " + name); 
    }, delay); 
} 



suite('Mega Suite', function(){ 

    suite("testing async hello", function() { 
    test('should call the callback', function(done) { 
     var cb = sinon.spy(); 
     asyncHello("foo", cb); 

     cb.should.have.been.called(); 
     done(); 
    }); 
    }); 
}); 

思想异步函数(setTimeout,在这种情况下)可以工作,但也许有人可以指出我错在哪里。谢谢!

回答

0

你不需要兴农此:

function asyncHello(name, delay, cb) { 
    setTimeout(function() { 
    console.log("running after ", delay); 
    cb("hello " + name); 
    }, delay); 
} 

suite('Mega Suite', function(){ 
    suite("testing async hello", function() { 
    test('should call the callback', function(done) { 
     asyncHello("foo", 1000, function() { 
     done(); 
     }); 
    }); 
    }); 
}); 

有两个问题在此代码:

  1. 你叫asyncHello("foo", cb);这使得它让你在函数内部delay论据是设置为cb,函数内部的cb参数未定义。

  2. 即使在确定第一项之后cb.should.have.been.called();在传递给setTimeout的函数可以执行之前被调用。

    你基本上不需要使用Sinon,因为如果你只是设置一个回调来呼叫done()那么你就知道测试是成功的。如果任何地方出现问题,done()将不会被调用,并且测试将失败。

+0

是的,我的部分是愚蠢的错误。感谢您指出了这一点。 :) 关于不使用Sinon的注意事项,但是如果我想窥探一个将进行异步调用的函数,那么使用Sinon的“正确”方法是什么? 我正在考虑像集成测试这样的事情,我想确保一个模块在给定情况下(即缓存未命中,所以去获取一些数据)进行正确的调用(比如说http.get())。但我可能不想在测试中一直打网络。 – virtualandy 2014-08-31 22:12:27