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
Node.js 在嵌套承诺中对回调进行单元测试_Node.js_Unit Testing_Promise_Callback_Sinon - Fatal编程技术网

Node.js 在嵌套承诺中对回调进行单元测试

Node.js 在嵌套承诺中对回调进行单元测试,node.js,unit-testing,promise,callback,sinon,Node.js,Unit Testing,Promise,Callback,Sinon,我正在使用sinon对nodejs项目进行单元测试。我想为下面的代码编写单元测试,并根据getPromise()响应的结果检查传递给回调函数的参数。下面是一些示例代码: export const authorize = (arg1, callback) => { try { getPromise('i promise') .then(response => { console.log('response.data: ', respons

我正在使用sinon对nodejs项目进行单元测试。我想为下面的代码编写单元测试,并根据getPromise()响应的结果检查传递给回调函数的参数。下面是一些示例代码:

export const authorize = (arg1, callback) => {
try {
    getPromise('i promise')
        .then(response => {
            console.log('response.data: ', response.data)
            if (response.data && response.data.active) {
                callback('Promise is resolved and data condition is met')
            } else {
                console.log('data is inactive ')
                callback('Promise is resolved but data condition is not met')
            }
        }).catch(err => {
            console.log('ERROR from promise: ', err.response)
            callback('Promise is rejected')
        })
    console.log('FINISHED in authorize')
} catch (err) {
    console.log('ERROR in authorize: ', err)
    callback('Error')
}
}

export const getPromise = (someArg: string) => {
    return new Promise<any>(resolve => {
        console.log('someArg: ', someArg)
        resolve({ data: { active: true }})
    }) 
}

const calledBack = (arg1) => {
    console.log('calledBack arg1: ', arg1)
}

authorize('first', calledBack)
export const authorize=(arg1,回调)=>{
试一试{
getPromise(“我保证”)
。然后(响应=>{
console.log('response.data:',response.data)
if(response.data&&response.data.active){
回调('承诺已解决且数据条件已满足')
}否则{
console.log('数据处于非活动状态')
回调('已解析承诺,但不满足数据条件')
}
}).catch(错误=>{
console.log('来自承诺的错误:',err.response)
回调('承诺被拒绝')
})
console.log('在授权中完成')
}捕捉(错误){
console.log('授权中出错:',错误)
回调('错误')
}
}
export const getPromise=(someArg:string)=>{
返回新承诺(解决=>{
log('someArg:',someArg)
解析({data:{active:true}})
}) 
}
常量calledBack=(arg1)=>{
log('calledBack arg1:',arg1)
}
授权('first',调用back)
下面是单元测试:

it('should pass a particular argument to the callback', () => {
const callbackSpy = sinon.spy()
getPromiseStub.callsFake(() : Promise<any> => {
    return new Promise(
        resolve => {
            resolve({
                data: { active: false }
            })
        }
    )
})
authorize('fakearg', callbackSpy)
const args = callbackSpy.args[0]
assert.deepEqual(callbackSpy.calledOnce, true)
assert.deepEqual(args, ['Promise is resolved but data condition is not met'])
})
it('应将特定参数传递给回调',()=>{
const callbackSpy=sinon.spy()
getPromiseStub.callsFake(():Promise=>{
回报新的承诺(
解析=>{
决心({
数据:{active:false}
})
}
)
})
授权('fakearg',callbackSpy)
常量args=callbackSpy.args[0]
assert.deepEqual(callbackSpy.calledOnce,true)
assert.deepEqual(args,['Promise已解析,但不满足数据条件']))
})

根据控制台日志语句,我可以看到当测试执行时,会发生预期的流,但是回调的参数总是未定义的。我猜测试在实际调用回调之前完成。处理这个问题的正确方法是什么?

请注意,如果我将authorize方法设为异步,然后等待getPromise()调用,它就会工作,但我不知道这会对下游产生什么影响。