【发布时间】:2021-02-15 07:05:17
【问题描述】:
我正在尝试为调用 Sequelize 以创建数据库的代码编写单元测试。
我终其一生都无法弄清楚如何模拟对 Sequelize 的调用,以便我可以断言它们已正确创建了数据库表。
我的 Sequelize 代码如下:
import { Sequelize, DataTypes } from "sequelize";
export setup_db = async (db_path: string) => {
//Get read/write connection to database
const sequelizeContext = new Sequelize({
dialect: "sqlite",
storage: db_path,
});
//Check if connection is secure, throw error if not
try {
await sequelizeContext.authenticate();
} catch (err) {
throw err;
}
//Define first table
const Table1 = sequelizeContext.define(
"table1",
{
fieldName_1: {
type: DataTypes.STRING
}
},
{ tableName: "table1" }
);
//Define second table
const Table2 = sequelizeContext.define(
"table2",
{
fieldName_1: {
type: DataTypes.STRING
},
{tablename: "table2"}
});
//Define relationship between tables... each Gamertag hasMany wzMatches
Table1.hasMany(Table2);
await Table1.sync();
await Table2.sync();
};
理想情况下,我想断言define 被正确调用,hasMany 被正确调用,sync 被每个数据库调用。
我目前的测试代码如下,虽然报错了
无法窥探 authenticate 属性,因为它不是函数;取而代之的是未定义。
import { setup_db } from "../../core/dataManager";
const Sequelize = require("sequelize").Sequelize;
describe("DataManager.setup_db", () => {
it("should call sequelize to correctly set up databases", async () => {
//Arrange
const authenticateSpy = jest.spyOn(Sequelize, "authenticate");
//Act
await setup_db("path/to/db.db");
//Assert
expect(authenticateSpy).toHaveBeenCalledTimes(1);
});
});
我不确定spyOn 是否是正确的调用方法,或者我是否可以/如何使用jest.mock 模拟和检查对Sequelize 的调用。
【问题讨论】:
标签: typescript unit-testing jestjs mocking sequelize.js