首页 > 解决方案 > 开玩笑 - 多次使用不同的测试设置运行一个测试模块

问题描述

有一个应用程序正在运行NodeJS。它的架构灵感来自 Oncle Bob 的书:“清洁架构”。一切都很完美,但是:目前我们对所有使用 fake-DB 运行的模块进行了单元测试。我们希望以这种方式进行集成测试:使用相同的测试(与我们用于单元测试的测试一样)进行集成测试,但“注入”真实的数据库。我怎么能这样做jest呢?我不想复制所有单元测试代码并创建代码重复(测试设置除外)。

单元测试实际上是这样的:

const DB = require("FakeDB");
let test_description = "unit-testing with FakeDB";

describe(`${test_description}`, () => {

    let db;

    beforeAll(() => {
        const cnf = create_config("test");
        db = new DB(cnf);
    });

    afterAll( () => {
        db.connection_close();
    });

    test("should save entity to DB", () => {
        try {
            // execute: save entity to DB 
        } catch (err) {
            console.error(err);
        }
    })
})

我怎么能注入另一个数据库,例如require("PostgresDB")

标签: node.jsunit-testingtestingjestjsintegration-testing

解决方案


假设我们有两个具有相同功能的模块 add.js 和 add_copy.js。

function add (a, b) {
    return a + b
  }

module.exports = {add}

安装 dotenvnpm install dotenv

创建 .evn 文件

DB=One

虚拟规格文件

let add;
if (process.env.DB == "One"){
     add = require('./add.js');
}
if (process.env.DB == "Two"){
     add = require('./add_copy.js');
}

let test_description = "unit-testing with FakeDB";

describe(`${test_description}`, () => {
    
    beforeAll(() => {
      
    });

    afterAll( () => {
        
    });

    test("some test", () => {
       console.log(add.add(2,3));

    })
})

本示例的 jest.config.js

require('dotenv').config();
module.exports = {
    verbose: true,
  };

这里的 'add' 根据 .evn 文件中提供的 'DB' 值进行更改。

你也可以试试类似的

let MyDB;
if (process.env.DB == "Fake"){
     MyDB= require("FakeDB")
}
if (process.env.DB == "Real"){
     MyDB= require("PostgresDB")
}

推荐阅读