簡體   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