使用 Mocha 和 chai 库测试节点 js 方法

Test nodejs methode with Mocha and chai libraries

我想用 Mocha 和 chai 测试下面的这个方法,但是我得到了一个错误: 我想用 Mocha 和 chai 测试下面的这个方法,但是我得到了一个错误:

exports.getCaracteristiques = (req,res) => {
  db.query('SELECT "titi", "toto"')
.then( ({rows}) => {
  var caracteristiqueResult = rows.map((row) => {
    return {
      'idCaracteristique': row.CARACT_ID
      , 'libelleCaracteristique': row.toto
      , 'libelleCaracteristique': row.titi

    };
  })
  res.json(caracteristiqueResult);
})
.catch(err => {
  // handle the error
  console.log("ERROR :", err)
  res.status(500).end(err)
})
   };

test.js 文件包含:

var expect = require('chai').expect; 
require("../config/config");


var ctr = require('../api/controllers/caracteristiques')

describe('Caracteristiques', () => {

it('returns an array of Carateristiques', () => {
    // This will fail if "Caracteristiques result "is
    // not  array.

    return ctr.getCaracteristiques.then(function(data){
        expect(data).to.be.a('array');

    });// no catch, it'll figure it out since the promise is rejected

  });
   })

但是我得到了这个错误:

 Caracteristiques
1) returns an array of Carateristiques


 0 passing (0ms)
 1 failing

 1) Caracteristiques
   returns an array of Carateristiques:
     TypeError: ctr.getCaracteristiques.then is not a function
    at Context.it (test\caracteristiques.js:13:40)

如何解决这个问题?

错误:

TypeError: ctr.getCaracteristiques.then is not a function

完全正确。您在调用 getCaracteristiques() 方法时错过了 ()

这应该有效:

return ctr.getCaracteristiques().then(function(data){
    expect(data).to.be.a('array');
});

OP评论后编辑:

在您的代码中,getCaracteristiques 需要一个 req 和一个 res 对象。我的猜测是您使用 express 或任何其他节点 js http 库,通常会为您填充。

在 mocha 中,我们自己调用方法,没有任何网络服务器,所以我们需要自己制作这些对象。

getCaracteristiques方法不使用req,但确实需要res有一个json()方法。所以我们可以这样做:

const res = {
  json: (a) => a,
};

return ctr.getCaracteristiques({}, res).then(function(data){
    expect(data).to.be.a('array');
});

在我们的测试中 getCaracteristiques return 我们想要的(只是数据,因为伪造的 json 方法只是放弃了它的参数)。

现在,测试将再次失败,因为 getCaracteristiques 不会 return json 调用。如果我们添加一个 return 语句,整个事情应该有效:

exports.getCaracteristiques = (req,res) => {
  return db.query('SELECT "CARACT_ID", "CARACT_LIB", "COULEUR", "IMAGE_ACTIVE", 
  "IMAGE_PASSIVE", "ACTIF" FROM "DIM_PRC_CARACT"')
  .then( ({rows}) => {
  var caracteristiqueResult = rows.map((row) => {
    return {
      'idCaracteristique': row.CARACT_ID
      , 'libelleCaracteristique': row.CARACT_CD
      , 'libelleCaracteristique': row.CARACT_LIB
      , 'couleurCaracteristique': row.COULEUR
      , 'pictogrammeActifCaracteristique': row.IMAGE_PASSIVE
      , 'pictogrammePassifCaracteristique': row.IMAGE_PASSIVE
    };
  })
  return res.json(caracteristiqueResult);
})

请注意 return 已添加到 db.queryres.json,因此 getCaracteristiques 方法现在 return 是对特性的承诺。