Тестовый метод nodejs с библиотеками Mocha и Chai - PullRequest
0 голосов
/ 17 декабря 2018

Я хочу проверить этот метод ниже с Мокко и Чай, но я получил ошибку: я хочу проверить этот метод ниже с Мокко и Чай, но я получил ошибку:

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 голосов
/ 17 декабря 2018

Ошибка:

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 возвращает то, что нам нужно (только данные, потому что метод fake 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);
})

Обратите внимание, что return был добавлен к db.query и res.json, поэтому метод getCaracteristiques теперь возвращаетобещание о характере.

...