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

Tre*_*red 10 javascript unit-testing node.js knex.js proxyquire

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

我尝试过使用proxyquire,但似乎无法让它工作.

问题似乎与Knex的初始化方式有关.

var knex = require('knex')({
  client: 'mysql',
  connection: {}
});
Run Code Online (Sandbox Code Playgroud)

我设置knex在我的单元测试中被嘲笑.

myService = proxyquire('../app/myService', {
        'knex': knexProxy
});
Run Code Online (Sandbox Code Playgroud)

我的服务包括knex.

var knex = require('knex').knex,
Run Code Online (Sandbox Code Playgroud)

当我的服务运行查询时,它会失败.

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

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

我也试图创建一个自定义的Knex客户端,但这还没有成功.

Edu*_*rdo 5

使用笑话

/__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)
  })
})
Run Code Online (Sandbox Code Playgroud)

将所需的返回值传递给 done

  • 我很难跟上。您可以添加一个使用此模拟的示例吗? (4认同)

Ste*_*unt 0

我一直在使用内存中的 Sqlite3 数据库进行自动化测试,并取得了巨大的成功。这不是真正的单元测试,但它的运行速度确实比 MySQL 或 PostgreSQL 快得多。我已经在另一个问题上发布了有关此解决方案的更多详细信息。