Javascript Jest:在测试文件之间共享变量

Javascript Jest:在测试文件之间共享变量,javascript,jestjs,Javascript,Jestjs,我将从一个如何为后端服务器设置测试的示例开始TL;底部的DR 此文件表示我的服务器: //server.js const express=require('express'); 类后端服务器{ 构造函数(backingFileDestination,数据库){ this.server=express(); /*设置服务器*/ /*设置mysql连接*/ } closeMySQLConnectionPool=()=>{ /*关闭mysql连接*/ }; } module.exports=后端服务器

我将从一个如何为后端服务器设置测试的示例开始TL;底部的DR

此文件表示我的服务器:

//server.js
const express=require('express');
类后端服务器{
构造函数(backingFileDestination,数据库){
this.server=express();
/*设置服务器*/
/*设置mysql连接*/
}
closeMySQLConnectionPool=()=>{
/*关闭mysql连接*/
};
}
module.exports=后端服务器;
在我的
package.json
中,我有以下内容:

“开玩笑”:{
“测试环境”:“节点”,
“SetupFileAfterEnv”:[
“/tests/setupTests.js”
]
}
允许我使用此设置文件进行测试:

//setupTests.js
const{endpointNames}=require('../../src/common/endpointNames.js');
const BackendServer=require('../server.js');
const server=新的后端服务器(
“../backing_files_test/”,
"测试",,
);
const supertest=require('supertest')(server.server);
//在运行任何测试之前,删除、重新创建和填充数据库一次
之前(异步()=>{
等待supertester.post(endpointNames.DROP_所有_表);
等待supertester.post(endpointNames.CREATE_ALL_TABLES);
等待supertester.post(endpointNames.POPULATE所有表);
});
//完成所有测试后,清理本地setupTests服务器实例
毕竟(异步()=>{
等待server.closeMySQLConnectionPool();
});
注意,我必须导入
BackendServer
类并实例化它,然后使用它的实例

现在,我有了其他测试文件,例如
test1.test.js

//test1.test.js
const{endpointNames}=require('../../src/common/endpointNames.js');
const BackendServer=require('../server.js');
const server=新的后端服务器(
“../backing_files_test/”,
"测试",,
);
const supertest=require('supertest')(server.server);
//完成所有测试后清理本地服务器实例
毕竟(异步()=>{
等待server.closeMySQLConnectionPool();
});
测试(‘废话’,()=>{
/*一些测试*/
});
问题是当我编写
test2.test.js
时,它将与
test1.test.js
相同。这就是问题所在。对于每个测试文件,我需要实例化一个新服务器,然后使用一个单独的
afterAll()
调用来清理该服务器的SQL连接。我不能把
afterAll()
放在
setupTests.js
的内部,因为它需要在
test1.test.js
的本地
服务器
实例上运行


TL;DR:我的每个测试文件都实例化了我的服务器的一个新实例。我想要的是在
setupTests.js
中实例化服务器一次,然后在我的所有测试中使用该实例。有没有一种好方法可以在我所有的测试文件之间共享这个实例?

我找到了一种方法来实现我想要的。它包括在
setupTests.js
中实例化变量,然后为它们导出getter

//setupTests.js
const{endpointNames}=require('../../src/common/endpointNames.js');
const BackendServer=require('../server.js');
const server=新的后端服务器(
“../backing_files_test/”,
"测试",,
);
const supertest=require('supertest')(server.server);
//在运行任何测试之前,删除、重新创建和填充数据库一次
之前(异步()=>{
等待supertester.post(endpointNames.DROP_所有_表);
等待supertester.post(endpointNames.CREATE_ALL_TABLES);
等待supertester.post(endpointNames.POPULATE所有表);
});
//完成所有测试后,清理本地setupTests服务器实例
毕竟(异步()=>{
等待server.closeMySQLConnectionPool();
});

const getServer=()=>{//{//老实说,即使在编程时重复自己是不好的,但在编写测试时,重复并不是一件坏事,在编写测试时您不必这样做。在测试中使用可变共享状态可能会导致混乱的错误,因为在运行新测试时,您经常会忘记从以前的测试中重置状态tests@TeedeezTh谢谢你的见解。我同意重用可变状态而不在测试之间重置可能是一个糟糕的选择。但是,无论是否首选,能够实现问题的技术目标仍然是很好的。我认为,例如,使用
beforeach()
重置和
afterAll()
清理
setupTests.js中的所有内容是一种比放置
afterAll()更好的方法
清理每个
.test.js
文件。@Teedeez另一个需要考虑的问题是,我需要使用
--runInBand
运行我的测试,因为每个
.test.js
文件实例化一个新的服务器,该服务器创建自己的数据库连接。当测试同时运行时,奇怪的事情开始发生。使用共享数据库连接池,我认为这不会是一个问题,我可以再次并行化测试。开玩笑的是,你可以关闭并行执行,我从来没有这样做过,但有可能,这样,你的测试就不会同时创建到database@Teedeez
——runInBand
是关闭并行执行的功能。