使用Mocha和Chai库测试Node.js方法

时间:2018-12-17 14:59:32

标签: node.js mocha chai

我想在下面用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)

如何解决此问题?

1 个答案:

答案 0 :(得分:0)

错误:

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中,我们是在没有任何Web服务器的情况下自行调用该方法的,因此我们需要自己制作这些对象。

getCaracteristiques方法未使用req,但确实需要res才能拥有json()方法。因此,我们可以这样做:

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

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

在测试中,getCaracteristiques返回我们想要的内容(只是数据,因为伪造的json方法只会产生其参数)。

现在,测试将再次失败,因为getCaracteristiques不会返回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);
})

请注意,在returndb.query中添加了res.json,因此getCaracteristiques方法现在返回了对特征的承诺。