如何使用 sinon 在一个函数中测试多个 promise
how to test muti promise in one function with sinon
这是我的函数,在这个函数中,'start'函数中有两个promise函数。我应该如何测试 'start' 函数。
export class TTT{
fun1(){
return new Promise(((resolve, reject) => {
console.log('function1');
resolve('function1');
}))
}
fun2(param){
return new Promise(((resolve, reject) => {
console.log('function2');
resolve(param);
}))
}
fun3(param){
console.log('function3');
return param;
}
async start(){
let param1 = await this.fun1();
let param2 = await this.fun2(param1);
this.fun3(param2);
}
}
而下一个测试文件是我自己写的。我存根 fun1、fun2 和 fun3,但似乎只有第一个函数有效。
describe('test',function () {
it('test ', function () {
let stub_fun1 =
sinon.stub(TTT.prototype,'fun1').callsFake((param)=>{
console.log('fun1');
return (Promise.resolve('fun1'));
});
let stub_fun2 =
sinon.stub(TTT.prototype,'fun2').callsFake((param)=>{
console.log('fun2');
return (Promise.resolve('fun2'));
});
let stub_fun3 =
sinon.stub(TTT.prototype,'fun3').callsFake((param)=>{
console.log('fun3');
return 'fun3';
});
let handler = new TTT();
let param = handler.start();
console.log(param);
stub_fun1.restore();
stub_fun2.restore();
stub_fun3.restore();
});
});
而且,结果是
测试
乐趣1
承诺{}
✓ 测试
函数2
函数 3
测试包含竞争条件。存根在调用之前被恢复。
start()
应该链接承诺:
it('test ', async function () {
...
let handler = new TTT();
let param = await handler.start();
...
});
当前设置需要手动调用 restore()
。如果测试失败,将不会恢复存根。 mocha-sinon
可用于省略 restore()
,为每个测试设置一个沙箱并自动恢复存根。
async start
是 promise 函数,所以在你的测试中,你需要通过指定 await
来告诉 mocha,所以它会在这个函数执行完成后 运行 console.log
。
describe('test', function () {
beforeEach(function() {
sinon.stub(TTT.prototype, 'fun1').callsFake((param)=>{
console.log('fun1');
return (Promise.resolve('fun1'));
});
sinon.stub(TTT.prototype, 'fun2').callsFake((param)=>{
console.log('fun2');
return (Promise.resolve('fun2'));
});
sinon.stub(TTT.prototype, 'fun3').callsFake((param)=>{
console.log('fun3');
return 'fun3';
});
})
afterEach(function() {
sinon.restore(); // use single restore
})
it('test ', async function () { // specify `async`
let handler = new TTT();
let param = await handler.start(); // specify `await`
console.log(param);
});
});
输出
test
fun1
fun2
fun3
undefined
✓ test
1 passing (13ms)
这是我的函数,在这个函数中,'start'函数中有两个promise函数。我应该如何测试 'start' 函数。
export class TTT{
fun1(){
return new Promise(((resolve, reject) => {
console.log('function1');
resolve('function1');
}))
}
fun2(param){
return new Promise(((resolve, reject) => {
console.log('function2');
resolve(param);
}))
}
fun3(param){
console.log('function3');
return param;
}
async start(){
let param1 = await this.fun1();
let param2 = await this.fun2(param1);
this.fun3(param2);
}
}
而下一个测试文件是我自己写的。我存根 fun1、fun2 和 fun3,但似乎只有第一个函数有效。
describe('test',function () {
it('test ', function () {
let stub_fun1 =
sinon.stub(TTT.prototype,'fun1').callsFake((param)=>{
console.log('fun1');
return (Promise.resolve('fun1'));
});
let stub_fun2 =
sinon.stub(TTT.prototype,'fun2').callsFake((param)=>{
console.log('fun2');
return (Promise.resolve('fun2'));
});
let stub_fun3 =
sinon.stub(TTT.prototype,'fun3').callsFake((param)=>{
console.log('fun3');
return 'fun3';
});
let handler = new TTT();
let param = handler.start();
console.log(param);
stub_fun1.restore();
stub_fun2.restore();
stub_fun3.restore();
});
});
而且,结果是
测试
乐趣1
承诺{}
✓ 测试
函数2
函数 3
测试包含竞争条件。存根在调用之前被恢复。
start()
应该链接承诺:
it('test ', async function () {
...
let handler = new TTT();
let param = await handler.start();
...
});
当前设置需要手动调用 restore()
。如果测试失败,将不会恢复存根。 mocha-sinon
可用于省略 restore()
,为每个测试设置一个沙箱并自动恢复存根。
async start
是 promise 函数,所以在你的测试中,你需要通过指定 await
来告诉 mocha,所以它会在这个函数执行完成后 运行 console.log
。
describe('test', function () {
beforeEach(function() {
sinon.stub(TTT.prototype, 'fun1').callsFake((param)=>{
console.log('fun1');
return (Promise.resolve('fun1'));
});
sinon.stub(TTT.prototype, 'fun2').callsFake((param)=>{
console.log('fun2');
return (Promise.resolve('fun2'));
});
sinon.stub(TTT.prototype, 'fun3').callsFake((param)=>{
console.log('fun3');
return 'fun3';
});
})
afterEach(function() {
sinon.restore(); // use single restore
})
it('test ', async function () { // specify `async`
let handler = new TTT();
let param = await handler.start(); // specify `await`
console.log(param);
});
});
输出
test
fun1
fun2
fun3
undefined
✓ test
1 passing (13ms)