【问题标题】:How to test Sequelize in Jasmine?如何在 Jasmine 中测试 Sequelize?
【发布时间】:2021-06-08 16:27:03
【问题描述】:

我使用以下代码在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 类本身来检查调用参数。

【问题讨论】:

    标签: javascript node.js postgresql unit-testing sequelize.js


    【解决方案1】:

    我没有大量使用 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)
      }
    });
    

    【讨论】:

      猜你喜欢
      • 2016-09-14
      • 2021-02-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      • 2014-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多