如何在NodeJS中使用一些模拟数据和mocha来存根mysql查询
我的要求是在单元测试脚本中使用stubing来绕过一些使用模拟数据的实际mysql查询。我正在使用mocha测试框架和chai。我不知道如何使用模拟数据来绕过mysql查询 我尝试了一些测试变量,如果该变量为真,我只是用预定义的模拟数据绕过mysql查询。但这不是一个适当的程序。所以,你能告诉我如何使用sinon存根来克服mysql使用模拟数据的问题吗如何在NodeJS中使用一些模拟数据和mocha来存根mysql查询,mysql,node.js,unit-testing,mocha.js,stub,Mysql,Node.js,Unit Testing,Mocha.js,Stub,我的要求是在单元测试脚本中使用stubing来绕过一些使用模拟数据的实际mysql查询。我正在使用mocha测试框架和chai。我不知道如何使用模拟数据来绕过mysql查询 我尝试了一些测试变量,如果该变量为真,我只是用预定义的模拟数据绕过mysql查询。但这不是一个适当的程序。所以,你能告诉我如何使用sinon存根来克服mysql使用模拟数据的问题吗 let query_response = await sequelize.query("select * from `" + table_nam
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 }];
有很多方法(依赖注入、运行时模块替换等)可以做到这一点,还有很多库可以帮助您。这取决于你的抽象程度和你想要的整洁程度。快速而肮脏的方法是使用类似的东西和类似的模拟库
使用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}})
预期常数=[{
id:'3',
xyz_id:'Z1455264',
病毒id:'264_3',
名称:“XYZ”,
pre_名称:“abc”,
价值:1
}, {
id:'32',
xyz_id:'Z1455dd264',
病毒id:'26s4_3',
名称:“XYZQ”,
pre_名称:“abdc”,
价值:1
}];
td.when(查询(“select*from``where email=''”…,{type:sequelize.QueryTypes.select})).thenResolve(预期);
//断言sut.doSomething()中需要的任何内容
我相信您有充分的理由不仅要安装一个小型mysql服务器并为其提供一点满足SQL语句要求的数据(创建和填充一个表需要2个简单的行=大约30秒),而且我认为您需要告诉我们它是什么。存根通常用来临时替换复杂的处理,但事实并非如此。@MandyShaw我知道我没有安装mysql服务器的原因。对于测试来说,这不是必需的。我喜欢绕过mysql查询。这就是为什么我没有安装。使用模拟数据预定义某些内容并绕过stubing的一部分。我知道什么是存根。ThanksFine-我只是惊讶于您所处的环境不需要定期使用其数据库!对我来说接受挑战很好。。。这就是我来这里的原因。您甚至可以完全抛弃proxyquire,因为testdouble也支持。
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()