如何在node.js中使用一些模拟数据和mocha来存根mysql查询

amrnrhlw  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(350)

我的要求是在单元测试脚本中使用stubing来绕过一些使用模拟数据的实际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
        });

在单元测试中,我需要绕过这个查询并使用一些模拟数据给出响应。React应该是这样的,

[ { 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 }];
nfzehxib

nfzehxib1#

有很多方法(依赖注入、运行时模块替换等)可以做到这一点,还有很多库可以帮助您。这取决于你的抽象程度和你想要的整洁程度。快速而肮脏的方法是使用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()

相关问题