我使用以下代码在 database/index.ts
文件中初始化一个 sequelize db:
import { Sequelize } from 'sequelize';
const {
DATABASE_DIALECT,
DATABASE_HOST,
DATABASE_PORT,
DATABASE_USER_NAME,
DATABASE_USER_PASSWORD,
DATABASE_NAME,
ENVIRONMENT
} = process.env;
const sequelize = new Sequelize({
host: DATABASE_HOST,
port: +(DATABASE_PORT as string),
dialect: DATABASE_DIALECT as 'postgres',
database: DATABASE_NAME,
username: DATABASE_USER_NAME,
password: DATABASE_USER_PASSWORD,
logging:
(ENVIRONMENT as string) === 'production' || (ENVIRONMENT as string) === 'acceptance'
? false
: console.log,
query: {
raw: true // Receive a plain object/array as a response from Sequelize (default response contains a lot of Sequelize metadata)
}
});
export default sequelize;
我需要测试 logging
属性,因为它由检查 ENV 的三元运算符确定。为了测试这一点,我需要检查调用了
new Sequelize(...)
的参数。这如何在 Jasmine 中完成?我读了很多文章,看起来我们无法监视
Sequelize
类本身来检查调用参数。
最佳答案
我没有大量使用 Sequelize,但是传递给 logging
的值似乎最终在 sequelize.options.logging
下(基于 https://github.com/sequelize/sequelize/blob/main/lib/sequelize.js#L277 )。所以在测试中引用 sequelize.options.logging
可能是最快的方法。
另一种方法可能是将对象文字(传递给 Sequelize
构造函数)存储在变量中。然后导出变量(使其在测试中可用)并将变量传递给 Sequelize
(以继续实例化)。就像是:
export const sequelizeOptions = {
host: DATABASE_HOST,
port: +(DATABASE_PORT as string),
dialect: DATABASE_DIALECT as 'postgres',
database: DATABASE_NAME,
username: DATABASE_USER_NAME,
password: DATABASE_USER_PASSWORD,
logging:
(ENVIRONMENT as string) === 'production' || (ENVIRONMENT as string) === 'acceptance'
? false
: console.log,
query: {
raw: true // Receive a plain object/array as a response from Sequelize (default response contains a lot of Sequelize metadata)
}
};
const sequelize = new Sequelize(sequelizeOptions);
export default sequelize;
从理论上讲,上述内容应该与您现在拥有的内容相同。它捕获和暴露对象的唯一区别。另一种方法可能是在
console.log
周围创建一个薄包装器,以便您可以监视包装器 - 然后将包装器作为构造函数选项的一部分传递:export const logger = (...args: any[]) => console.log(...args);
const sequelize = new Sequelize({
host: DATABASE_HOST,
port: +(DATABASE_PORT as string),
dialect: DATABASE_DIALECT as 'postgres',
database: DATABASE_NAME,
username: DATABASE_USER_NAME,
password: DATABASE_USER_PASSWORD,
logging:
(ENVIRONMENT as string) === 'production' || (ENVIRONMENT as string) === 'acceptance'
? false
: logger,
query: {
raw: true // Receive a plain object/array as a response from Sequelize (default response contains a lot of Sequelize metadata)
}
});
关于javascript - 如何在 Jasmine 中测试 Sequelize?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66569650/