Как заглушить MySQL запрос, используя некоторые фиктивные данные и мокко в узле JS
Мое требование - использовать заглушки в скрипте модульного тестирования, чтобы обойти какой-то реальный запрос MySQL, используя фиктивные данные. Я использую фреймворк Mocha и Chai. Я не знаю, как использовать фиктивные данные, чтобы обойти запрос MySQL.
Я попытался с некоторой проверочной переменной, и если переменная истинна, я просто обхожу запрос mysql с предопределенными фиктивными данными. Но это не правильное решение. Поэтому, пожалуйста, объясните мне, как использовать заглушку sinon для преодоления mysql, используя фиктивные данные.
let query_response = await sequelize.query("select * from `" + table_name + "` where email='" + data.user + "' and name = '" + name + "' " + pre_name + ";", {
type: sequelize.QueryTypes.SELECT
});
В модульном тестировании мне нужно обойти этот запрос и дать ответ, используя некоторые фиктивные данные. Ответ должен быть таким,
[ { id: '3',
xyz_id: 'Z1455264',
vir_id: '264_3',
name: 'XYZ',
pre_name: 'abc',
value: 1 },
{ id: '32',
xyz_id: 'Z1455dd264',
vir_id: '26s4_3',
name: 'XYZQ',
pre_name: 'abdc',
value: 1 }];
1 ответ
Существует множество способов (внедрение зависимостей, замена модулей во время выполнения и т. Д.), И множество библиотек, которые могут вам помочь. Это зависит от уровня вашей абстракции и от того, насколько вы этого хотите. Быстрый и грязный способ - использовать что-то вроде proxyquire и насмешливую библиотеку вроде testdouble.
С вашим sut.js (модуль / система, которую вы будете тестировать) вы получите:
const sequelize = require('sequelize')
// ...
exports.doSomething = async function () {
await sequelize.query("select * from `" + table_name + "` where email='" + data.user + "' and name = '" + name + "' " + pre_name + ";", {
type: sequelize.QueryTypes.SELECT
})
}
И в вашем тесте вы могли бы сделать следующее (независимо от среды тестирования):
const proxyquire = require('proxyquire')
const td = require('testdouble')
const sequelize = require('sequelize')
const query = td.function()
const sut = proxyquire('/path/to/your/sut.js', { 'sequelize': { query } })
const expected = [{
id: '3',
xyz_id: 'Z1455264',
vir_id: '264_3',
name: 'XYZ',
pre_name: 'abc',
value: 1
}, {
id: '32',
xyz_id: 'Z1455dd264',
vir_id: '26s4_3',
name: 'XYZQ',
pre_name: 'abdc',
value: 1
}];
td.when(query("select * from `<the_table_name>` where email='<the_email>'...", { type: sequelize.QueryTypes.SELECT })).thenResolve(expected);
// assert whatever you need from sut.doSomething()