Nodejs Koa2 的 app.js 里写的分支单元测试怎么覆盖?

发布于 1周前 作者 sinazl 来自 nodejs/Nestjs

Nodejs Koa2 的 app.js 里写的分支单元测试怎么覆盖?
因为项目需要,在 app.js 一开始就动态加载了某个确定的 env 变量,并根据这些变量值通过 if else 选择要 app.use(…) 的不同中间件,问题来了:
在写单元测试时,无法有效覆盖到所有 if else 分支,毕竟环境变量在很早的时候就已经加载,app.js 也早于 unit test 加载。这就是说我跑单元测试的时候,app.js 早就以某种特定的 env 跑完了所有逻辑。

那么有没有办法,在单元测试时修改 env 重新加载 app.js 呢?

6 回复

由测试框架按需控制服务的启动和停止,让服务成为测试框架的子进程。


战略关注一下

插眼
await exc(‘npm start && setModel =‘test’’)

在Node.js中使用Koa2框架进行开发时,编写单元测试并覆盖所有分支是至关重要的。为了实现这一点,你可以使用像Mocha、Chai和Supertest这样的测试库。以下是一个基本的示例,展示如何为Koa2的app.js编写分支单元测试,并确保测试覆盖所有分支。

首先,确保你已经安装了必要的依赖:

npm install --save-dev mocha chai supertest

假设你的app.js文件包含以下简单的路由:

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
  if (ctx.path === '/') {
    ctx.body = 'Home Page';
  } else if (ctx.path === '/about') {
    ctx.body = 'About Page';
  } else {
    ctx.status = 404;
    ctx.body = 'Not Found';
  }
});

module.exports = app;

你可以编写如下的测试文件test/app.test.js

const request = require('supertest');
const app = require('../app');
const { expect } = require('chai');

describe('GET requests', () => {
  it('should return Home Page for /', async () => {
    const res = await request(app).get('/');
    expect(res.text).to.equal('Home Page');
  });

  it('should return About Page for /about', async () => {
    const res = await request(app).get('/about');
    expect(res.text).to.equal('About Page');
  });

  it('should return 404 for unknown path', async () => {
    const res = await request(app).get('/unknown');
    expect(res.status).to.equal(404);
    expect(res.text).to.equal('Not Found');
  });
});

运行测试:

npx mocha test/app.test.js

这将确保你的所有分支都被覆盖。

回到顶部