我正在尝试为Sequelize模型编写单元测试。我在课堂上有一个实例方法,用于调用Sequelize的id
方法。将update
转换为模拟函数是没有问题的。我似乎无法弄清楚如何在没有某种错误的情况下正确地执行update
。它告诉我X = new MyModel()
。
我看了https://sequelize-mock.readthedocs.io/en/stable/但是它的编写方式让我觉得它更适合在测试利用模型的类时模拟模型,而不是模特本身。
Class constructor model cannot be invoked without 'new'
因此,使用上面的代码示例,如果我有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
。我只是不知道如何初始化类然后嘲笑事物。
我想写的测试的目的只是看到更新是使用正确的参数调用,基于我自己的与Sequelize无关的代码。我希望确保在转到 Sequelize时,我对输入的转换是正确的。我不打算检查数据库是否实际更新。我遇到的唯一问题实际上是实例化模型。
所以我需要的是这样的代码才能工作:
update
我不确定为什么它说我需要用const instance = new Utut(); // This line doesn't work
instance.update = Jest.fn();
调用,这正是我正在做的事情。
答案 0 :(得分:0)
因此,利用从Model
返回的Sequelize.define
会导致此问题。我没有做class Utut extends BaseUtut {
,而是这样做了:
// Static methods
Object.assign(BaseUtut, {});
// Instance methods
Object.assign(BaseUtut.prototype, {});
这样做可以让我在模型上new
执行我的测试中没有问题