javascript - 如何实例化要在单元测试中使用的 Sequelize 模型?
问题描述
我正在尝试为 Sequelize 模型编写单元测试。我在调用 Sequelize 方法的类上有一个实例update
方法。变成update
一个模拟函数是没有问题的。我似乎无法弄清楚如何在X = new MyModel()
没有某种错误的情况下正确执行 a 。它告诉我Class constructor model cannot be invoked without 'new'
。
我看了一下https://sequelize-mock.readthedocs.io/en/stable/但它的编写方式让我认为它更适合在测试利用模型的类时模拟模型,而不是模型本身。
const BaseUtut = sequelizeInstance.define('utut', {
id: {
type: Sequelize.INTEGER,
primaryKey: true,
autoIncrement: true
},
metadata: {
type: Sequelize.JSON
}
});
class Utut extends BaseUtut {
async updateFromFlat(id, metadata) {
// in reality, i modify metadata, and want to test things around that
modifiedMetadata = methodThatModified(metadata);
// I want to see that update is called with the right output of the modified metadata
return await this.update(
{
id: id,
metadata: modifiedMetadata
},
{
where: {
locale: metadata.locale
}
}
);
}
}
因此,使用上面的代码示例,如果我有一个实例,Utut
我知道我可以轻松地模拟update
. 我只是不知道如何初始化类然后模拟事物。
我要编写的测试的目的只是为了查看使用正确的参数调用更新,基于我自己的与 Sequelize 无关的代码。我想确保在进行Sequelize 时我的输入转换设置正确。我不打算检查数据库是否实际更新。我遇到的唯一问题实际上是实例化模型。
所以我需要的只是让这样的代码工作:
const instance = new Utut(); // This line doesn't work
instance.update = Jest.fn();
我不确定为什么它说我需要调用 with new
,而这正是我正在做的事情。
解决方案
因此,利用Model
从Sequelize.define
导致此问题返回的优势。我没有这样做,而是这样做class Utut extends BaseUtut {
:
// Static methods
Object.assign(BaseUtut, {});
// Instance methods
Object.assign(BaseUtut.prototype, {});
这样做可以让我new
在模型上做,在我的测试中没有问题
更新
刚刚在 2019 年 9 月 23 日看到这个问题没有得到答复。上面的答案看起来是针对旧版本的。我现在只是做
class MyClass extends Sequelize.Model {}
MyClass.init(definition, options);
export default MyClass;
推荐阅读
- css - 如何最小化 Wordpress 的超级菜单和搜索框上方和下方的空间?
- intellij-idea - IntelliJ Kubernetes View 不显示任何集群信息
- sql - BigQuery:自加入后按月分组计数器
- forms - 如何在表单动作百里香中使用条件
- html - 如何在 Algolia Instant Search 中将复选框更改为图标?
- javascript - 节点 cron 作业执行重复
- sql - 计数返回不正确的结果
- linux-kernel - 究竟是什么扩展了 KERN_INFO,它在哪里实现?
- php - PHP - 如何使用函数检查?
- php - 编辑文本文件 - 删除不必要的字符