有一个应用程序在NodeJS上运行。它的架构灵感来自Oncle Bob的书:"Clean Architecture“。一切都运行得很完美,但是:目前我们已经对所有使用fake-DB运行的模块进行了单元测试。我们希望以这种方式进行集成测试:对集成测试使用相同的测试(与我们用于单元测试的测试相同),但“注入”真正的DB。我怎么能用jest做到这一点呢?我不想复制所有的单元测试代码并创建重复的代码(除了test-setup)。
单元测试实际上是这样的:
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")
发布于 2021-01-22 15:19:20
假设我们有两个具有相同功能的模块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")
}发布于 2021-01-19 10:39:52
您首先需要分解一段代码,该代码设置运行测试的对象。完成此操作后,您可以运行两次测试:一次针对假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);
}
}https://stackoverflow.com/questions/65782656
复制相似问题