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,因此请确保您不时地针对其中一个运行应用程序,以确保您的约束能够正常运行.