nul*_*omo 10 javascript jestjs
我将从一个示例开始,说明如何为后端服务器设置测试。TL;DR 在底部。
该文件代表我的服务器:
//server.js
const express = require('express');
class BackendServer {
constructor(backingFileDestination, database) {
this.server = express();
/* Set up server ... */
/* Set up a mysql connection ... */
}
closeMySQLConnectionPool = () => {
/* Close the mysql connection ... */
};
}
module.exports = BackendServer;
Run Code Online (Sandbox Code Playgroud)
在我的 中package.json,我有以下内容:
"jest": {
"testEnvironment": "node",
"setupFilesAfterEnv": [
"<rootDir>/tests/setupTests.js"
]
}
Run Code Online (Sandbox Code Playgroud)
这允许我使用这个设置文件进行测试:
//setupTests.js
const { endpointNames } = require('../../src/common/endpointNames.js');
const BackendServer = require('../server.js');
const server = new BackendServer(
'../backing_files_test/',
'test',
);
const supertester = require('supertest')(server.server);
// drop, recreate, and populate the database once before any tests run
beforeAll(async () => {
await supertester.post(endpointNames.DROP_ALL_TABLES);
await supertester.post(endpointNames.CREATE_ALL_TABLES);
await supertester.post(endpointNames.POPULATE_ALL_TABLES);
});
// clean up the local setupTests server instance after all the tests are done
afterAll(async () => {
await server.closeMySQLConnectionPool();
});
Run Code Online (Sandbox Code Playgroud)
请注意我如何导入该类BackendServer并实例化它,然后使用它的实例。
现在,我有其他测试文件,例如test1.test.js:
//test1.test.js
const { endpointNames } = require('../../src/common/endpointNames.js');
const BackendServer = require('../server.js');
const server = new BackendServer(
'../backing_files_test/',
'test',
);
const supertester = require('supertest')(server.server);
// clean up the local server instance after all tests are done
afterAll(async () => {
await server.closeMySQLConnectionPool();
});
test('blah blah', () => {
/* Some test ... */
});
Run Code Online (Sandbox Code Playgroud)
问题是当我去写的时候test2.test.js,它会和一样test1.test.js。这就是问题所在。对于每个测试文件,我需要实例化一个新服务器,然后进行单独的afterAll()调用来清理该服务器的 SQL 连接。我不能将其放入afterAll()其中,因为它需要在的本地实例setupTests.js上进行操作。test1.test.jsserver
TL;DR:我的每个测试文件都会实例化我的服务器的一个新实例。我想要的是实例化服务器一次setupTests.js,然后在我的所有测试中简单地使用该实例。有没有一种好方法可以在我的所有测试文件之间共享这个单个实例?
nul*_*omo 12
我能够找到一种方法来实现我想要的。它涉及实例化变量,setupTests.js然后为它们导出 getter。
//setupTests.js
const { endpointNames } = require('../../src/common/endpointNames.js');
const BackendServer = require('../server.js');
const server = new BackendServer(
'../backing_files_test/',
'test',
);
const supertester = require('supertest')(server.server);
// drop, recreate, and populate the database once before any tests run
beforeAll(async () => {
await supertester.post(endpointNames.DROP_ALL_TABLES);
await supertester.post(endpointNames.CREATE_ALL_TABLES);
await supertester.post(endpointNames.POPULATE_ALL_TABLES);
});
// clean up the local setupTests server instance after all the tests are done
afterAll(async () => {
await server.closeMySQLConnectionPool();
});
const getServer = () => { // <==== ADD THESE 2 FUNCTIONS
return server;
};
const getSupertester = () => { // <==== ADD THESE 2 FUNCTIONS
return supertester;
};
module.exports = { getServer, getSupertester }; // <==== EXPORT THEM
Run Code Online (Sandbox Code Playgroud)
我在其末尾添加了几个函数setupTests.js,当调用时,将返回当时局部变量指向的任何内容。在这种情况下,server和supertester是用 声明的const,所以我想我可以直接导出它们,但在其他情况下,我想共享一些用 声明的变量let,所以我就这样保留了。
现在我已经导出了函数,setupTests.js可以将其导入到我的测试文件中,如下所示:
//test1.test.js
const { endpointNames } = require('../../src/common/endpointNames.js');
const { getServer, getSupertester } = require('./setupTests.js');
test('blah blah', () => {
/* Some test using getSupertester().post() or getServer().someFunction() ... */
});
Run Code Online (Sandbox Code Playgroud)
所以现在我可以在文件中包含setupTests.js可访问的局部变量.test.js。
这使得我的整个测试过程更加清晰,因为我只需要设置和拆除一台服务器,这意味着我的 SQL 服务器只有 1 个连接池,并且减少了必须在每个文件中实例化和清理新服务器的代码重复.test.js。
干杯。