Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Sinon单元测试。如何对一个函数进行单元测试,该函数将返回一个使用回调函数调用另一个函数的承诺?_Javascript_Unit Testing_Testing_Sinon_Ava - Fatal编程技术网

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您需要为每个测试还原stubbed
bookService.InfoRequest()
方法。因此,
在每次(()=>{sinon.restore())之后(