Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在NodeJS中使用一些模拟数据和mocha来存根mysql查询_Mysql_Node.js_Unit Testing_Mocha.js_Stub - Fatal编程技术网

如何在NodeJS中使用一些模拟数据和mocha来存根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

我的要求是在单元测试脚本中使用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
        });
在单元测试中,我需要绕过这个查询,并使用一些模拟数据给出响应。反应应该是这样的,

[ { 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()