我想在下面用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)
如何解决此问题?
答案 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);
})
请注意,在return
和db.query
中添加了res.json
,因此getCaracteristiques
方法现在返回了对特征的承诺。