Как заглушить 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()
Другие вопросы по тегам