gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:08:36 24 4
gpt4 key购买 nike

我对 Node 比较陌生,并且正在使用 knex 和书架进行项目。我在单元测试我的代码时遇到了一些麻烦,我不确定我做错了什么。

基本上我有一个看起来像这样的模型(称为 VorcuProduct):

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

module.exports.VorcuProduct = VorcuProduct

如果 VorcuProduct 在 DB 上不存在,该函数会保存它。非常简单。执行此操作的函数如下所示:

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 执行相同操作?我应该为此使用重新布线吗?

如您所见,我有点迷茫,因此我们将不胜感激。

谢谢!

最佳答案

我一直在使用in-memory Sqlite3 databases自动化测试取得了巨大成功。我的测试在 MySQL 上运行需要 10 到 15 分钟,但使用内存中的 sqlite3 数据库只需 30 秒左右。使用 :memory: 作为连接字符串以利用此技术。

关于单元测试的说明 - 这不是真正的单元测试,因为我们仍在对数据库运行查询。这在技术上是集成测试,但它会在合理的时间段内运行,如果您有一个查询量很大的应用程序(比如我的),那么无论如何,这种技术在捕捉错误方面将比单元测试更有效。

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

关于node.js - 使用 Bookshelf.js 和 knex.js 进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27840634/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com