如何在节点 js 中使用一些模拟数据和 mocha 存根 mysql 查询
How to stub mysql query using some mock data and mocha in node js
我的要求是在单元测试脚本中使用存根来绕过一些使用模拟数据的实际 mysql 查询。我正在使用 mocha 测试框架和 chai。我不知道如何使用模拟数据绕过 mysql 查询。
我尝试了一些测试变量,如果变量为真,我只是绕过使用预定义模拟数据的 mysql 查询。但这不是一个适当的程序。那么你能解释一下如何使用 sinon stub 来克服使用模拟数据的 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 }];
有很多方法(依赖注入、运行时模块替换等)可以做到这一点,还有很多库可以帮助您。这取决于您拥有的抽象级别以及您想要它的整洁程度。快速而肮脏的方法是使用像 proxyquire and a mocking library like testdouble.
这样的东西
使用您的 sut.js(您将测试的 module/system),您将拥有:
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()
我的要求是在单元测试脚本中使用存根来绕过一些使用模拟数据的实际 mysql 查询。我正在使用 mocha 测试框架和 chai。我不知道如何使用模拟数据绕过 mysql 查询。
我尝试了一些测试变量,如果变量为真,我只是绕过使用预定义模拟数据的 mysql 查询。但这不是一个适当的程序。那么你能解释一下如何使用 sinon stub 来克服使用模拟数据的 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 }];
有很多方法(依赖注入、运行时模块替换等)可以做到这一点,还有很多库可以帮助您。这取决于您拥有的抽象级别以及您想要它的整洁程度。快速而肮脏的方法是使用像 proxyquire and a mocking library like testdouble.
这样的东西使用您的 sut.js(您将测试的 module/system),您将拥有:
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()