开玩笑 - 运行 一个测试模块多次使用不同的测试设置
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")
}
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")
}