使用 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.query
和 res.json
,因此 getCaracteristiques
方法现在 return 是对特性的承诺。
我想用 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.query
和 res.json
,因此 getCaracteristiques
方法现在 return 是对特性的承诺。