Javascript 使用mocha构建异步代码测试(请求)

Javascript 使用mocha构建异步代码测试(请求),javascript,node.js,mocha.js,chai,Javascript,Node.js,Mocha.js,Chai,我正在尝试在Node.JS上使用Mocha和Chai创建单元测试。下面是要测试的函数的简化版本: router.cheerioParse = function(url, debugMode, db, theme, outCollection, _callback2) { var nberror = 0; var localCount = 0; console.log("\nstarting parsing now : " + theme); request(ur

我正在尝试在Node.JS上使用Mocha和Chai创建单元测试。下面是要测试的函数的简化版本:

router.cheerioParse = function(url, debugMode, db, theme, outCollection, _callback2) {
    var nberror = 0;
    var localCount = 0;
    console.log("\nstarting parsing now :  " + theme);
    request(url, function(error, response, body) {
        //a lot of postprocessing here that returns 
        //true when everything goes well)
    });
}
以下是我试图编写的测试:

describe('test', function(){
    it('should find documents', function(){
        assert(  true ==webscraping.cheerioParse("http://mytest.com,   null, null, null ,null,null ));
    });
})

请求
函数如何返回true以通过测试?我试着用承诺,但也没用。在这种情况下,我应该将return语句放在
然后
回调中吗?最好的方法是什么?

您应该模拟
请求
函数。例如,您可以使用
sinon
存根(它们提供定义返回值的
returns
函数)

一般来说,单元测试的思想是分离特定的功能(测试单元)和存根(stub)每个其他依赖项,就像您应该处理
请求
:)

为此,您必须覆盖原始的
请求
对象,例如:

before(function() {
  var stub = sinon.stub(someObjectThatHasRequestMethod, 'request').returns(true);
});
在运行测试之后,您应该取消发布此对象,以便将来进行类似的测试:

after(function() {
  stub.restore();
});
仅此而已:)您可以在每次之后/之后使用
,也可以在每次之前/之前使用
——选择一个更适合您的

还有一点需要注意——因为您的代码是异步的,所以您的解决方案可能需要更复杂的测试方法。您可以提供完整的
request
mock函数,并在返回如下值时调用
done()
callback:

it('should find documents', function(done) {
  var requestStub = sinon.stub(someObjectThatHasRequestMethod, 'request',
    function(url, function (error, response, body) {
      done();
      return true;
  }
  assert(true === webscraping.cheerioParse("http://mytest.com,   null, null, null ,null,null ));
  requestStub.restore();
});
您可以在此处找到更多信息:

摩卡咖啡支持和