我正在尝试用Mocha和Chai在Node.JS上创建单元测试。下面是要测试的函数的简化版本:
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以将其传递给测试?我尝试过使用promises,但它也不起作用。在这种情况下,我是否应该将返回语句放在then
回调中?最好的方法是什么?
发布于 2016-01-05 00:54:01
你应该模拟request
函数。你可以使用例如sinon
存根(它们提供了用于定义返回值的returns
函数)。
一般来说,单元测试的思想是将特定的函数(测试单元)和存根( stub )分开,就像您应该对request
所做的那样:)
为此,您必须覆盖原始request
对象,例如:
before(function() {
var stub = sinon.stub(someObjectThatHasRequestMethod, 'request').returns(true);
});
在运行测试之后,您应该取消这个对象的存根,以便将来进行类似的测试:
after(function() {
stub.restore();
});
这就是全部:)你可以同时使用afterEach/after
或beforeEach/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();
});
你可以在这里找到更多信息:
https://stackoverflow.com/questions/34602541
复制相似问题