[英]unit testing ava + sinon for api call, one of the stub is not working
我有一个测试用例需要测试具有 2 个上层 promise 功能的 function。 我存根所有这 3 个功能,前 2 个工作正常,但最后一个似乎没有工作..
classD:
const obj1 = require('./classA');
const obj2 = require('./classB');
const obj3 = require('./classC');
const getTeam = () =>{
return new Promise((resolve, reject) => {
obj1.promiseFunc1().then(res1 => {
if(res1.error){
reject(res1);
}else{
resolve({Teamid: 1, TeamName: 'goodName'});
}
})
}
const getMember = () => {
return new Promise((resolve, reject) => {
obj2.promiseFunc2().then(res2 => {
if(res2.id.length === 0){
obj3.promiseFunc3().then(res3 => {
if(res3.error){
reject(res3);
}else{
getTeam().then(res => {
if(res.error){
reject(res);
}else{
resolve(res);
}
});
}
})
}
})
})
}
下面是测试用例:
Test.js
const obj1 = require('./classA');
const obj2 = require('./classB');
const obj3 = require('./classC');
const obj4 = require('./classD');
const sandbox = require('sinon').createSandbox();
test.serial('test getMember', async (t) => {
sandbox.restore();
sandbox.stub(obj2, 'promiseFunc2').resolves({id: [], error: false});
sandbox.stub(obj3, 'promiseFunc3').resolves({status: 200, error: false});
sandbox.stub(obj4, 'getTeam').resolves({data: [], error: false});
const result = await obj4.getMember();
console.log('result :' + JSON.stringify(result));
})
所以我需要为 function obj4.getMember() 运行测试用例,它将调用 obj2.promiseFunc2、obj3.promiseFunc3 和 obj4.getTeam(),它们都返回 Promise。 我存根 promiseFunc2 和 promiseFunc3 没有问题。 但由于某种原因, obj4.getTeam() 似乎无法正常工作。 我返回了 {Teamid: 1, TeamName: 'goodName'} 这是 getTeam() 同一文件中最后一个测试用例的响应...
我希望返回 {data: [], error: false} 这是我存根的结果..
任何人都知道为什么存根不起作用? 如何让它发挥作用?
非常感谢!
从 obj4.getMember 调用getTeam
作为obj4.getMember
可能会绕过 Simon 的存根。
尝试以下操作:
const obj1 = require('./classA');
const obj2 = require('./classB');
const obj3 = require('./classC');
const obj4 = {};
obj4.getTeam = () =>{
return new Promise((resolve, reject) => {
obj1.promiseFunc1().then(res1 => {
if(res1.error){
reject(res1);
}else{
resolve({Teamid: 1, TeamName: 'goodName'});
}
})
})
}
obj4.getMember = () => {
return new Promise((resolve, reject) => {
obj2.promiseFunc2().then(res2 => {
if(res2.id.length === 0){
obj3.promiseFunc3().then(res3 => {
if(res3.error){
reject(res3);
}else{
obj4.getTeam().then(res => {
if(res.error){
reject(res);
}else{
resolve(res);
}
});
}
})
}
})
})
}
module.exports = obj4;
我认为您不应该将模块称为“类”,因为它设定了错误的期望。
至于 Promise 链接,不幸的是您的 API 不会拒绝错误,这会迫使您添加很多错误处理逻辑,但是助手可以将这些承诺转换为被拒绝的承诺
const rejectOn = predicate => f => (...xs) =>
f(...xs).then(x => predicate(x) ? Promise.reject(x) : x);
const error = x => x.error;
有了这个,以下内容将更易于阅读并且功能相同(假设objN.promiseFuncN
不是具有上下文的方法)。 Note that there is no need to wrap a promise-returning function in a new Promise and that returning a Promise replaces the surrounding Promise, removing a lot of boilerplate from your code.
obj4.getTeam = () =>
rejectOn(error)(obj1.promiseFunc1)()
.then(() => ({ Teamid: 1, TeamName: 'goodName' }));
obj4.getMember = () =>
rejectOn(x => x.id.length)(obj2.promiseFunc2)()
.then(rejectOn(error)(obj3.promiseFunc3))
.then(rejectOn(error)(obj4.getTeam));
也许你应该和你的经理谈谈。 干净的代码不会减慢您的速度。 腐烂的代码会减慢你的速度。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.