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

时间:2016-01-05 00:48:11

标签: javascript node.js mocha 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(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 ));
    });
})

request函数如何返回true才能将其传递给测试?我试图使用承诺,但它也没有用。在这种情况下,我应该将return语句放在then回调中吗?什么是最好的方法?

1 个答案:

答案 0 :(得分:0)

你应该模仿request功能。你可以用例如sinon存根(它们提供returns函数来定义返回值)。

一般而言 - 单元测试的想法是将特定功能(测试单元)和存根所有其他依赖关系分开,就像你应该使用request:)

为此,您必须覆盖原始request对象,例如:

before(function() {
  var stub = sinon.stub(someObjectThatHasRequestMethod, 'request').returns(true);
});

在运行测试之后,您应该取消存储此对象以用于将来的测试:

after(function() {
  stub.restore();
});

这就是全部:)你可以使用afterEach/afterbeforeEach/before - 选择最适合你的那个。

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

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();
});

您可以在此处找到更多信息:

Mocha - asynchronous code testing