开玩笑 - 运行 一个测试模块多次使用不同的测试设置

jest - run one test-module with different test setup multiple times

NodeJS 上有一个应用程序 运行。它的架构灵感来自 Oncle Bob 的书:“Clean Architecture”。一切都很完美,但是: 目前,我们对所有模块 运行 假数据库进行了单元测试。我们想以这种方式进行集成测试:使用相同的测试(就像我们用于单元测试的那样)进行集成测试,但“注入”真实的数据库。 我怎么能用 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")?

您首先需要分解设置测试运行 所针对的内容的代码段。完成后,您就可以 运行 测试两次:一次针对假 dB,另一次针对真实 dB。

这只是我的想法,但它可能正是您要找的。不过,您可能可以做更多的工作来清理它:

const FakeDB = require("FakeDB")
const RealDB = require("PostgresDB")
describe('unit testing with FakeDB', () => {
   let db;

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

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

    test("should save entity to DB", () => {
        myTest(db);
    })
})

describe('unit testing with RealDB', () => {
   let db;

    beforeAll(() => {
        const cnf = create_config("real");
        db = new RealDB(cnf);
    });

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

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

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

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

module.exports = {add}

安装 dotenv npm 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")
}