我对Node相对较新,并且正在使用knex和书架进行项目。我在对代码进行单元测试时遇到了一些麻烦,但是我不确定自己做错了什么。
基本上,我有一个看起来像这样的模型(称为VorcuProduct):
var VorcuProduct = bs.Model.extend({ tableName: 'vorcu_products' }); module.exports.VorcuProduct = 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) } }) }
哪种方法可以在不影响数据库的情况下进行测试?我是否需要模拟fetch以返回模型或未定义模型(取决于测试),然后对它进行相同操作save?我应该为此使用重布线吗?
fetch
save
如您所见,我有点迷路,因此不胜感激。
谢谢!
我一直在使用内存中的Sqlite3数据库进行自动化测试,并取得了巨大的成功。我的测试需要10到15分钟才能在MySQL上运行,而使用内存中的sqlite3数据库则只需30秒左右。使用:memory:您的连接字符串,利用这种技术。
:memory:
关于单元测试的注释 -这不是真正的单元测试,因为我们仍在对数据库运行查询。这是技术上的集成测试,但是它在合理的时间段内运行,并且如果您有大量查询的应用程序(例如我的),那么该技术将比任何单元测试更有效地捕获错误。
陷阱 -Knex / Bookshelf在应用程序启动时初始化连接,这意味着您可以在测试之间保留上下文。我建议编写一个模式创建/销毁脚本,以便您以及为每个测试构建和销毁表。另外,Sqlite3对外键约束的敏感度不及MySQL或PostgreSQL,因此请确保您不时针对其中之一运行应用程序,以确保约束条件能够正常运行。