Javascript Sinon单元测试。如何对一个函数进行单元测试,该函数将返回一个使用回调函数调用另一个函数的承诺?
我是新来西农的,但我已经四处寻找了一段时间,试图找到这个问题的答案 我有一个需要测试的函数,它返回一个调用另一个函数的承诺,将回调。。 下面是我需要为其编写测试用例的函数:Javascript Sinon单元测试。如何对一个函数进行单元测试,该函数将返回一个使用回调函数调用另一个函数的承诺?,javascript,unit-testing,testing,sinon,ava,Javascript,Unit Testing,Testing,Sinon,Ava,我是新来西农的,但我已经四处寻找了一段时间,试图找到这个问题的答案 我有一个需要测试的函数,它返回一个调用另一个函数的承诺,将回调。。 下面是我需要为其编写测试用例的函数: const bookService = require(./bookService); const getBook = () => { const bookName = "book"; const bookID = '111'; return new Promise((resolve,
const bookService = require(./bookService);
const getBook = () => {
const bookName = "book";
const bookID = '111';
return new Promise((resolve, reject) => {
bookService.InfoRequest(bookName, bookID, 'GET', res => {
if(res.error){
reject(res);
}else{
const list = res['allPages'] || [];
if(list = []){
resolve({
pageNumber: 0,
note: "book is no longer exist"
});
}else{
resolve(res['allPages']);
}
}
})
})
}
bookService.InfoRequest方法没有返回它返回回调(res)的任何内容
我尝试了bookService.InfoRequest方法,但由于它没有返回任何内容,我不确定如何修改回调参数来测试所有3个分支
我正在使用Ava,所以我尝试了以下方法:
test('getBook Error Block', t=> {
const stub = sinon.stub(bookService, InfoRequest);
stub.callsFake(() => {
return { error: true };
});
return obj.getBook().then(res => {
t.deepEqual(res, []);
}).catch(error => {
console.log(error.error);
t.deepEqual(error.error, true);
})
})
这是第一个分支,拒绝(res)分支的测试用例。还有两个非常相似,只是callFake不同
但问题是我无法打印出错误,测试显示它通过了,但如果我将true更改为false,它也会通过…由
.callFake()
执行的存根实现不正确。bookService.InfoRequest()
方法接受一个回调参数,res
被传递到此回调。因此,您需要为这个回调函数提供一个存根实现,并传递您的伪错误
例如
bookService.js
:
函数InfoRequest(bookName,bookId,method,cb){
module.exports={InfoRequest};
obj.js
:
const bookService=require('./bookService');
常量getBook=()=>{
const bookName='book';
常量bookID='111';
返回新承诺((解决、拒绝)=>{
InfoRequest(bookName,bookID,'GET',(res)=>{
if(res.error){
拒绝(res);
}否则{
const list=res['allPages']| |[];
如果((列表=[])){
决心({
页码:0,
注意:'书本已不存在',
});
}否则{
解决(res['allPages');
}
}
});
});
};
module.exports={getBook};
obj.test.js
:
const obj=require('./obj');
const bookService=require('./bookService');
const sinon=要求(“sinon”);
常数测试=要求('ava');
测试('getBook错误块',(t)=>{
const res={error:newerror('network')};
const stub=sinon.stub(bookService,'InfoRequest').callsFake((bookName,bookId,method,callback)=>{
回收(res);
});
返回obj.getBook().catch((res)=>{
t、 深度相等(误差,误差);
sinon.assert.calledWith(存根'book','111','GET',sinon.match.func);
});
});
测试结果:
> nyc ava --timeout=3000 "/Users/dulin/workspace/github.com/mrdulin/expressjs-research/src/stackoverflow/66702460/obj.test.js"
1 test passed
----------------|---------|----------|---------|---------|-------------------
File | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s
----------------|---------|----------|---------|---------|-------------------
All files | 71.43 | 16.67 | 75 | 71.43 |
bookService.js | 100 | 100 | 0 | 100 |
obj.js | 69.23 | 16.67 | 100 | 69.23 | 11-18
----------------|---------|----------|---------|---------|-------------------
非常感谢你的回答!!成功了。但是当我为另一个分支编写第二个测试用例时,它返回一个错误:消息:“试图包装已经包装好的InfoRequest”…这是我的第二个测试用例:test('getBook empty Block',(t)=>{const res={};const stub=sinon.stub(bookService,'InfoRequest')。callsFake((bookName,bookId,method,callback)=>{callback(res);};返回obj.getBook().then((res)=>{t.deepEqual(res,{});sinon.assert.calledWith(stub,'book','111','GET',sinon.match.func);});@TianQin您需要为每个测试还原stubbedbookService.InfoRequest()
方法。因此,在每次(()=>{sinon.restore())之后(