【问题标题】:How to configure jest-mongodb(@shelf/jest-mongodb) in typescript-node project?如何在 typescript-node 项目中配置 jest-mongodb(@shelf/jest-mongodb)?
【发布时间】:2020-04-05 10:57:24
【问题描述】:

我正在进行集成测试,因此从数据库中获取数据会使测试用例的执行速度变慢。尝试使用 jest-mongodb 设置临时数据库。但找不到在 typescript-nodejs 项目中设置 jest-mongodb 的适当文档。请帮我解决这个问题。

test.ts(基于此测试套件连接db的db配置文件)

export default {    
    jwtPrivateKey: 'secretkey',
    // Testing Database configuration
    MongoDB: {
        dbConfig: {
            user: 'user name',
            host: 'some host',
            port: 'some port',
            authMechanism: 'some mechanism',
            authSource: 'access level',
            dbName: 'database name',
            metadata: 'initializer'
        }
    }
};

【问题讨论】:

标签: javascript node.js typescript jestjs


【解决方案1】:

创建文件:typings/global.d.ts:

declare namespace NodeJS {
  export interface Global {
    __MONGO_URI__: string;
  }
}

那么,在你的tsconfig.json

{
  "compilerOptions": { ... },
  "include": ["./src/**/*", "./typings/*"]
}

【讨论】:

  • 嘿,我已经更新了问题中的配置文件,请您给出一些详细的答案,以便我能够清楚地理解。
【解决方案2】:

进行此设置的一种方法如下:

通过 Babel 使用 TypeScript 配置 Jest:

yarn add --dev babel-jest @babel/core @babel/preset-env @babel/preset-typescript

然后在您的 babel 配置中,您将拥有:

// babel.config.js
 module.exports = {
  presets: [
    ["@babel/preset-env", { targets: { node: "current" } }],
    "@babel/preset-typescript"
  ]
};

你可以在这里找到文档Jest TypeScript support via Babel

最后将 @shelf/jest-mongodb 添加到您的 jest.config.js

// jest.config.js
module.exports = {
  preset: "@shelf/jest-mongodb",
  verbose: true
};

现在你可以开始了。在您的测试文件中,您可以通过以下方式访问测试数据库 URL:

process.env.MONGO_URL

或者

const globalAny: any = global;
globalAny.__MONGO_URI__

【讨论】:

    【解决方案3】:

    看起来@shelf/jest-mongodb 已经删除了暴露的全局变量,并用单个环境变量替换了它们。这很方便地解决了声明全局类型的需要。

    来自https://github.com/shelfio/jest-mongodb#readme

    const {MongoClient} = require('mongodb');
    
    describe('insert', () => {
      let connection;
      let db;
    
      beforeAll(async () => {
        connection = await MongoClient.connect(process.env.MONGO_URL, { // <= MONGO_URL env var set
          useNewUrlParser: true,
          useUnifiedTopology: true
        });
        db = await connection.db(); // <= env var (presumably) includes the db so no longer need to pass this
      });
    
      afterAll(async () => {
        await connection.close();
      });
    });
    

    因此无需修改您的 tsconfig.json 配置来支持此功能。

    【讨论】:

      【解决方案4】:

      请改用process.env.MONGO_URL

      import { connect } from 'mongoose'
      
      beforeAll(async () => {
        await connect(process.env.MONGO_URL as string)
      })
      

      【讨论】:

        【解决方案5】:

        Jest MongoDB 提供了使用 MongoDB 运行测试所需的所有配置。 Described Here

        首先你需要安装@shelf/jest-mongodb,

        yarn add @shelf/jest-mongodb --dev
        

        然后在您的 Jest 配置中指定预设:

        {
          "preset": "@shelf/jest-mongodb"
        }
        

        然后开始编写测试。喜欢:

        const {MongoClient} = require('mongodb');
        
        describe('insert', () => {
          let connection;
          let db;
        
          beforeAll(async () => {
            connection = await MongoClient.connect(global.__MONGO_URI__, {
              useNewUrlParser: true,
            });
            db = await connection.db(global.__MONGO_DB_NAME__);
          });
        
          afterAll(async () => {
            await connection.close();
            await db.close();
          });
        
          it('should insert a doc into collection', async () => {
            const users = db.collection('users');
        
            const mockUser = {_id: 'some-user-id', name: 'John'};
            await users.insertOne(mockUser);
        
            const insertedUser = await users.findOne({_id: 'some-user-id'});
            expect(insertedUser).toEqual(mockUser);
          });
        });
        

        无需加载任何依赖项。请参阅 GitHub 上的 Jest-MongoBD Documentation

        [如果对您有帮助,请投票给这个答案]

        【讨论】:

        • 嘿,我已经参考了文档并在 javascript 代码中实现了。它工作正常并且测试用例正在通过。但是在尝试使用 typescript MONGO_DB_NAME 时会引发错误。请仔细阅读问题并回答。如果您提供一些示例代码而不是复制粘贴文档,那将非常有帮助。
        • 问题是关于打字稿和@shelf/jest-mongodb注入的global.__MONGO*变量,而不仅仅是如何使用模块。
        猜你喜欢
        • 2021-06-24
        • 1970-01-01
        • 1970-01-01
        • 2022-12-09
        • 2018-12-11
        • 1970-01-01
        • 2020-02-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多