使用Bookshelf.js和knex.js进行单元测试

Mar*_*ote 21 unit-testing node.js bookshelf.js knex.js

我是Node的新手,正在使用knex和bookshelf开展项目.我在测试代码时遇到了一些麻烦,我不确定我做错了什么.

基本上我有一个模型(称为VorcuProduct),如下所示:

var VorcuProduct = bs.Model.extend({
    tableName: 'vorcu_products'
});

module.exports.VorcuProduct = VorcuProduct
Run Code Online (Sandbox Code Playgroud)

如果数据库上不存在VorcuProduct,则保存VorcuProduct的函数.非常简单.执行此操作的功能如下所示:

function subscribeToUpdates(productInformation, callback) {
  model.VorcuProduct
    .where({product_id: productInformation.product_id, store_id: productInformation.store_id})
    .fetch()
    .then(function(existing_model) {
        if (existing_model == undefined) {
            new model.VorcuProduct(productInformation)
                .save()
                .then(function(new_model) { callback(null, new_model)})
                .catch(callback);
        } else {
            callback(null, existing_model)
        }
    })
}
Run Code Online (Sandbox Code Playgroud)

在没有命中数据库的情况下测试这个的正确方法是什么?我是否需要模拟fetch返回模型或未定义(取决于测试),然后执行相同的操作save?我应该使用重新连线吗?

如你所见,我有点迷失,所以任何帮助将不胜感激.

谢谢!

Ste*_*unt 20

我一直在使用内存中的Sqlite3数据库进行自动化测试,取得了巨大的成功.我的测试需要10到15分钟才能对MySQL运行,但内存sqlite3数据库只需30秒左右.使用:memory:您的连接字符串,利用这种技术.

关于单元测试的注意事项 - 这不是真正的单元测试,因为我们仍然在对数据库运行查询.这是技术上的集成测试,但是它在合理的时间段内运行,如果你有一个查询繁重的应用程序(比如我的),那么这种技术在捕获错误方面比单元测试更有效.

问题 - Knex/Bookshelf在应用程序启动时初始化连接,这意味着您在测试之间保持上下文.我建议编写一个模式创建/销毁脚本,以便您为每个测试构建和销毁表.此外,Sqlite3对外键约束的敏感度低于MySQL或PostgreSQL,因此请确保您不时地针对其中一个运行应用程序,以确保您的约束能够正常运行.