如何在Node.js的Sequelize Mock中编写Sequelize.js原始查询的测试用例
我无法理解使用Sequelize Mock在sequelizejs中为原始查询编写测试用例。
我的函数,成功返回200状态的优惠券对象
try {
const domain = req.params.domain;
const domainFilter = { domain: { [Op.eq]: req.params.domain } };
const merchant = await models.merchants.findOne({ where: domainFilter });
if (merchant) {
const coupons = await models.sequelize.query(`SELECT * FROM coupons LEFT JOIN coupon_activities ON coupons.coupon=coupon_activities.coupon WHERE coupons.domain='${domain}' ORDER BY coupon_activities.best_discount DESC, coupon_activities.worked DESC, coupons.expire_date DESC LIMIT 50`, { type: sequelize.QueryTypes.SELECT });
if (coupons && coupons.length > 0) {
const keys = [...new Set(coupons[0].map(el => el.coupon))]
const filteredCoupons = coupons[0].filter(el => {
if (keys.indexOf(el.coupon) !== -1) {
keys.splice(keys.indexOf(el.coupon), 1)
return true;
} else {
return false;
}
});
res.status(200).send({ coupons: filteredCoupons });
} else {
res.status(204).send({ response: "No Coupons" });
}
} else {
res.status(204).send({ response: "No Content" });
}
} catch (err) {
console.log(err);
res.status(500).send({ response: "Error in server" });
}
功能测试用例
describe('Get Coupons By Merchand Id', () => {
it('It got all coupons of a merchant', (done) => {
const merchant_id = 1;
chai.request(server)
.get('/api/coupons/' + merchant_id)
.end((err, res) => {
res.should.have.status(200);
res.body.should.be.a('object');
res.body.should.not.have.property('errors');
res.body.coupons.length.should.not.equal(0);
res.body.coupons[0].merchant_id.should.be.equal(merchant_id);
done();
});
});
});
模拟我已设置
'use strict';
const dbMock = require('./sequelize_mock');
const Op = dbMock.Op;
let SequelizeMock = dbMock.define("sequelize", {
merchant_id: 1,
domain: 'amazon',
coupon: 'TESTCOUPON',
description: 'This is a test',
expiry_date: '12-12-9999',
}, {
indexes: [{ fields: ['merchant_id'] }],
createdAt: false,
updatedAt: false,
id: false,
tableName: 'coupons',
});
SequelizeMock.$queryInterface.$useHandler(function(query, queryOptions, done) {
console.log('TCL: query', query)
console.log('TCL: queryOptions', queryOptions)
});
module.exports = SequelizeMock;
但是它无法正常工作,给我一个错误,有人可以帮助我正确设置此模拟,以便我可以根据查询或有效的方法发送回数据。
当前未定义错误序列化
回答如下:同样,我搜索sequelize-mock文档,但与此无关。但是我在github上找到了这个例子:
如果使用的是sequelize.query()函数,则可以排队从该函数返回的模拟序列对象的结果也一样与模型一样,您只需要使用。$ queueResult()方法。 -来自用户:LoveAndCoding
https://github/BlinkUX/sequelize-mock/issues/53