如何使用Mocha和Chai测试Strapi端点 - LogRocket博客

作者:API传播员 · 2025-11-01 · 阅读时间:6分钟

测试是开发应用程序过程中常常被忽视的重要环节。它不仅为用户提供了对产品质量的信心,还能帮助开发者及时发现潜在的错误。在本教程中,我们将详细讲解如何使用 Mocha 和 Chai 测试基于 Strapi 构建的 RESTful API。Strapi 是一种开源的无头 JavaScript CMS,能够快速构建可定制的 API,而无需关注底层架构的复杂性。


先决条件

在开始之前,请确保您具备以下条件:

  • 熟悉 JavaScript 编程。

安装 Strapi

首先,打开终端并运行以下命令来安装 Strapi:

npx create-strapi-app strapi-mocha-chai --quickstart

上述命令会初始化一个名为 strapi-mocha-chai 的 Strapi 项目,并使用 SQLite 数据库作为默认配置。如果您希望选择其他数据库,可以省略 --quickstart 标志。

安装完成后,应用程序会自动启动。如果没有启动,可以通过以下命令手动启动:

npm run develop

打开浏览器,访问 http://localhost:1337/,您将看到一个注册页面。完成注册后,您会进入 Strapi 的仪表板,从这里可以开始创建 API 端点。


创建 API 端点

我们将以一个简单的待办事项(To-Do)应用为例,创建以下 RESTful API 端点:

  • POST /todos:用于创建新的待办事项。

创建内容类型

  1. 在侧边栏中点击“插件”,然后选择“内容类型生成器”。
  2. 点击“创建新的集合类型”,输入 Todos 作为显示名称并继续。
  3. 按照提示完成内容类型的配置。

配置权限

  1. 在“插件”部分选择“角色和权限”。
  2. 点击“公开”角色,并为以下操作授予权限:
    • 创建(Create)
    • 删除(Delete)
    • 查找(Find)
    • 查找单个(Find One)

完成后,您可以使用 Postman 测试这些端点是否正常工作。


添加测试依赖

在开始测试之前,您需要安装必要的依赖库。运行以下命令:

yarn add mocha chai chai-http cross-env

安装完成后,打开项目的 package.json 文件,在 scripts 部分添加以下测试命令:

"scripts": {
  "develop": "strapi develop",
  "start": "strapi start",
  "build": "strapi build",
  "strapi": "strapi",
  "test": "cross-env NODE_ENV=test mocha --timeout 10000"
}
  • Mocha:一个灵活的 JavaScript 测试框架,支持串行和异步测试。
  • Chai:一个断言库,支持 BDD(行为驱动开发)和 TDD(测试驱动开发)。
  • chai-http:一个插件,用于测试 HTTP 请求。
  • cross-env:用于设置跨平台的环境变量。

配置测试环境

为了避免测试影响开发数据库,我们需要为测试创建一个独立的数据库配置。

创建测试数据库配置

运行以下命令:

cd config
mkdir env && cd env
mkdir test && cd test
touch database.json

config/env/test/database.json 文件中,添加以下内容:

{
  "defaultConnection": "default",
  "connections": {
    "default": {
      "connector": "bookshelf",
      "settings": {
        "client": "sqlite",
        "filename": ".tmp/test.db"
      },
      "options": {
        "useNullAsDefault": true,
        "pool": {
          "min": 0,
          "max": 15
        }
      }
    }
  }
}

每次运行测试时,.tmp/test.db 文件都会被重新生成。


初始化 Strapi 实例

在测试之前,需要创建一个 Strapi 实例。运行以下命令:

mkdir tests
cd tests
mkdir helpers
touch helpers/strapi.js

tests/helpers/strapi.js 文件中,添加以下代码:

const Strapi = require('strapi');
const http = require('http');
let instance;

async function setupStrapi() {
  if (!instance) {
    await Strapi().load();
    instance = strapi;
    await instance.app
      .use(instance.router.routes())
      .use(instance.router.allowedMethods());
    instance.server = http.createServer(instance.app.callback());
  }
  return instance;
}

module.exports = { setupStrapi };

编写测试用例

测试 Strapi 实例

tests 目录下创建 app.test.js 文件,并添加以下代码:

const fs = require('fs');
const { setupStrapi } = require('./helpers/strapi');
const chai = require('chai');
const expect = chai.expect;

before((done) => {
  setupStrapi();
  done();
});

after((done) => {
  const dbSettings = strapi.config.get('database.connections.default.settings');
  if (dbSettings && dbSettings.filename) {
    const tmpDbFile = ${__dirname}/../${dbSettings.filename};
    if (fs.existsSync(tmpDbFile)) {
      fs.unlinkSync(tmpDbFile);
    }
  }
  done();
});

it('strapi is defined', (done) => {
  expect(strapi).to.exist;
  done();
});

测试 API 端点

tests 目录下创建 todo/index.test.js 文件,并添加以下代码:

const { setupStrapi } = require('../helpers/strapi');
const chai = require('chai');
const chaiHttp = require('chai-http');
const expect = chai.expect;
chai.use(chaiHttp);

let app;

before(async () => {
  app = await setupStrapi();
});

after((done) => {
  const dbSettings = app.config.get('database.connections.default.settings');
  if (dbSettings && dbSettings.filename) {
    const tmpDbFile = ${__dirname}/../${dbSettings.filename};
    if (fs.existsSync(tmpDbFile)) {
      fs.unlinkSync(tmpDbFile);
    }
  }
  done();
});

it('creates a todo item', (done) => {
  chai
    .request(app.server)
    .post('/todos/')
    .send({ title: 'Sample 2', completed: true })
    .end((error, response) => {
      expect(response).to.have.status(200);
      expect(response.body).to.have.property('title');
      done();
    });
});

运行测试

在终端中运行以下命令以执行测试:

yarn test

如果一切正常,您将看到类似以下的测试结果:


总结

通过本教程,您学习了如何使用 Mocha 和 Chai 测试 Strapi 应用程序。测试是软件开发的重要组成部分,能够帮助您提高代码质量并减少潜在问题的发生。

希望本教程对您有所帮助!

原文链接: https://blog.logrocket.com/how-to-test-strapi-endpoints-with-mocha-and-chai/