我正在尝试使用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
回调中吗?什么是最好的方法?
答案 0 :(得分:0)
你应该模仿request
功能。你可以用例如sinon
存根(它们提供returns
函数来定义返回值)。
一般而言 - 单元测试的想法是将特定功能(测试单元)和存根所有其他依赖关系分开,就像你应该使用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();
});
您可以在此处找到更多信息: