如何使用 jest 在 strapi 版本 4 中添加单元测试?
How to add unit testing in strapi version 4 using jest?
我正在尝试在全新的 strapi 应用程序上添加单元测试。官方文档还在制作中。那么,在文档准备好之前,有没有办法将 jest 单元测试添加到 strapi 应用程序?我遵循了 v3 文档中的方法,但没有成功。
在初始化 Strapi 应用程序的 API 时,从 Strapi V3 到 Strapi V4 有很多变化。最重要的变化是 Strapi 如何填充 KOA 路由,以及如何向 http 服务器发出请求。
要填充 KOA 路线,请使用
await instance.server.mount();
而不是
await instance.app
.use(instance.router.routes()) // populate KOA routes
.use(instance.router.allowedMethods()); // populate KOA methods
instance.server = http.createServer(instance.app.callback());
调用 http 服务器使用
strapi.server.httpServer
而不是
strapi.server
您还需要在定义测试数据库时使用新的数据库配置架构。您可以使用以下内容作为测试的初始设置。
以下是基于 Strapi V3 Unit Testing guide 的更新(和 WIP)指南。
第一个运行
yarn add --dev jest supertest sqlite3
或
npm install --save-dev jest supertest sqlite3
然后将以下内容添加到您的 ./package.json 脚本中:
"scripts": {
// ...strapi scripts
"test": "jest --forceExit --detectOpenHandles", //add
"watch": "yarn test --watch", // optional
}
然后添加以下文件:
./jest.config.js
module.exports = {
verbose: true,
testPathIgnorePatterns: [
"/node_modules/",
".tmp",
".cache"
],
modulePaths: [
"/node_modules/",
],
testEnvironment: "node",
};
./config/env/test/database.json
{
"connection": {
"client": "sqlite",
"connection": {
"filename": ".tmp/test.db"
},
"useNullAsDefault": true,
"pool": {
"min": 0,
"max": 1
}
}
}
./tests/helpers/strapi.js
const Strapi = require("@strapi/strapi");
const fs = require("fs");
let instance;
async function setupStrapi() {
if (!instance) {
await Strapi().load();
instance = strapi;
await instance.server.mount();
}
return instance;
}
async function cleanupStrapi() {
const dbSettings = strapi.config.get("database.connection");
const tmpDbFile = dbSettings.connection.filename
//close server to release the db-file
await strapi.server.httpServer.close();
//delete test database after all tests
if (dbSettings && tmpDbFile) {
if (fs.existsSync(tmpDbFile)) {
fs.unlinkSync(tmpDbFile);
}
}
// close the connection to the database
await strapi.db.connection.destroy();
}
module.exports = { setupStrapi, cleanupStrapi };
请注意,您需要在项目中指定 /hello 端点 in the strapi docs 才能通过下一个测试。
./tests/app.test.js
const { setupStrapi, cleanupStrapi } = require("./helpers/strapi");
jest.setTimeout(15000);
beforeAll(async () => {
await setupStrapi();
});
afterAll(async () => {
await cleanupStrapi();
});
it("strapi is defined", () => {
expect(strapi).toBeDefined();
});
require('./hello')
./tests/hello/index.js
const request = require('supertest');
it('should return hello world', async () => {
await request(strapi.server.httpServer)
.get('/api/hello')
.expect(200) // Expect response http code 200
});
我希望这可以帮助任何遇到同样问题的人。我会随着进度更新答案。
我正在尝试在全新的 strapi 应用程序上添加单元测试。官方文档还在制作中。那么,在文档准备好之前,有没有办法将 jest 单元测试添加到 strapi 应用程序?我遵循了 v3 文档中的方法,但没有成功。
在初始化 Strapi 应用程序的 API 时,从 Strapi V3 到 Strapi V4 有很多变化。最重要的变化是 Strapi 如何填充 KOA 路由,以及如何向 http 服务器发出请求。
要填充 KOA 路线,请使用
await instance.server.mount();
而不是
await instance.app
.use(instance.router.routes()) // populate KOA routes
.use(instance.router.allowedMethods()); // populate KOA methods
instance.server = http.createServer(instance.app.callback());
调用 http 服务器使用
strapi.server.httpServer
而不是
strapi.server
您还需要在定义测试数据库时使用新的数据库配置架构。您可以使用以下内容作为测试的初始设置。
以下是基于 Strapi V3 Unit Testing guide 的更新(和 WIP)指南。
第一个运行
yarn add --dev jest supertest sqlite3
或
npm install --save-dev jest supertest sqlite3
然后将以下内容添加到您的 ./package.json 脚本中:
"scripts": {
// ...strapi scripts
"test": "jest --forceExit --detectOpenHandles", //add
"watch": "yarn test --watch", // optional
}
然后添加以下文件:
./jest.config.js
module.exports = {
verbose: true,
testPathIgnorePatterns: [
"/node_modules/",
".tmp",
".cache"
],
modulePaths: [
"/node_modules/",
],
testEnvironment: "node",
};
./config/env/test/database.json
{
"connection": {
"client": "sqlite",
"connection": {
"filename": ".tmp/test.db"
},
"useNullAsDefault": true,
"pool": {
"min": 0,
"max": 1
}
}
}
./tests/helpers/strapi.js
const Strapi = require("@strapi/strapi");
const fs = require("fs");
let instance;
async function setupStrapi() {
if (!instance) {
await Strapi().load();
instance = strapi;
await instance.server.mount();
}
return instance;
}
async function cleanupStrapi() {
const dbSettings = strapi.config.get("database.connection");
const tmpDbFile = dbSettings.connection.filename
//close server to release the db-file
await strapi.server.httpServer.close();
//delete test database after all tests
if (dbSettings && tmpDbFile) {
if (fs.existsSync(tmpDbFile)) {
fs.unlinkSync(tmpDbFile);
}
}
// close the connection to the database
await strapi.db.connection.destroy();
}
module.exports = { setupStrapi, cleanupStrapi };
请注意,您需要在项目中指定 /hello 端点 in the strapi docs 才能通过下一个测试。
./tests/app.test.js
const { setupStrapi, cleanupStrapi } = require("./helpers/strapi");
jest.setTimeout(15000);
beforeAll(async () => {
await setupStrapi();
});
afterAll(async () => {
await cleanupStrapi();
});
it("strapi is defined", () => {
expect(strapi).toBeDefined();
});
require('./hello')
./tests/hello/index.js
const request = require('supertest');
it('should return hello world', async () => {
await request(strapi.server.httpServer)
.get('/api/hello')
.expect(200) // Expect response http code 200
});
我希望这可以帮助任何遇到同样问题的人。我会随着进度更新答案。