javascript - 当针对 Knex 进行单元测试时,如何模拟假数据库?

标签 javascript node.js unit-testing knex.js proxyquire

我一直在使用 Knex成功连接到后端数据库。但我希望能够对我的代码进行单元测试。有没有办法模拟数据库连接?

我试过使用 proxyquire但我似乎无法让它工作。

问题似乎出在 Knex 的初始化方式上。

var knex = require('knex')({
  client: 'mysql',
  connection: {}
});

我将 knex 设置为在我的单元测试中被模拟。

myService = proxyquire('../app/myService', {
        'knex': knexProxy
});

我的服务包括 knex。

var knex = require('knex').knex,

当我的服务运行查询时,它失败了。

var sql = knex("table_name");
sql.insert(rowToInsert, "auto_increment_id");
sql.then(function (insertId) {
    resolve();
}, function (err) {
    reject(err);
});

出于某种原因,我似乎无法在尝试连接之前捕获请求。

我也曾尝试创建一个 custom Knex Client ,但这也没有奏效。

最佳答案

使用 jest :

在您的应用程序根目录中创建文件 /__mocks__/knex.js:

module.exports = () => ({
  select: jest.fn().mockReturnThis(),
  from: jest.fn().mockReturnThis(),
  where: jest.fn().mockReturnThis(),
  first: jest.fn().mockReturnThis(),
  then: jest.fn(function (done) {
    done(null)
  })
})

将所需的返回值传递给done

关于javascript - 当针对 Knex 进行单元测试时,如何模拟假数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28165063/

相关文章:

unit-testing - 在golang中重新定义const进行测试

javascript - 对表中的行进行排序

javascript - 数据库中的行不比较 Ajax、Jquery

javascript - JavaScript 中的动画,一个起点

javascript - 如何使用 Protractor js 测试非 Angular 站点?

javascript - 如何使用 Electron webContents.print([options], [callback]) 打印 html/文本文件?

node.js - Azure Function 如何根据命令启动更大的 Node.js 应用程序

java - 如何根据服务调用模拟私有(private)成员变量

unit-testing - Grails 单元测试在其 Controller 中模拟域类

node.js - 使用 npm 安装 bootstrap 失败