繁体   English   中英

单元测试 ava + sinon 用于 api 调用,其中一个存根不起作用

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM