[eggjs/egg]egg-bin test --watch 不以最新代码运行

2024-03-29 486 views
5

官方例子编写单元测试:

// extend/helper.js
'use strict';

module.exports = {
  money(val) {
    const lang = this.ctx.get('Accept-Language');
    if (lang.includes('zh-CN')) {
      return `¥ ${val}`;
    }
    return `$ ${val}`;
  },
};
//test/app/extend/helper.test.js

'use strict';

const { app, assert } = require('egg-mock/bootstrap');

describe('money()', () => {
  it('should RMB', () => {
    const ctx = app.mockContext({
      // 模拟 ctx 的 headers
      headers: {
        'Accept-Language': 'zh-CN,zh;q=0.5',
      },
    });
    assert(ctx.helper.money(100) === '¥ 100');
  });

  it('should US Dolar', () => {
    const ctx = app.mockContext();
    assert(ctx.helper.money(100) === '$ 100');
  });
});

运行 egg-bin test --watch 测试通过;

修改 test/app/extend/helper.test.js 文件,去掉 '¥',测试自动运行,should RMB 不通过;

恢复 test/app/extend/helper.test.js 文件,测试全部通过,然后修改 extend/helper.js 文件 去掉 '¥' ,测试自动运行。理论上should RMB会失败,但实际测试依然通过。也就是说 修改 extend/helper.js 文件之后,测试运行的不是最新的helper.js,一直运行的是启动 egg-bin test --watch 命令时的 helper.js;

相关环境信息
  • 操作系统:macOS 10.13.4
  • Node 版本:v12.14.0
  • Egg 版本:2.27.0

回答

7

你看一下 egg-bin test --help

  --typescript, --ts     whether enable typescript support, will load `ts-node/register` etc                      [布尔]
  --declarations, --dts  whether create dts, will load `egg-ts-helper/register`                                   [布尔]
  --require, -r          require the given module                                                                 [数组]
  --grep, -g             only run tests matching <pattern>                                                        [数组]
  --timeout, -t          set test-case timeout in milliseconds                                                    [数字]
  --full-trace           display the full stack trace
  --changed, -c          only test with changed files and match ${cwd}/test/**/*.test.(js|ts)
  --dry-run, -d          whether show test command, no test will be executed 

你 --watch 参数哪来的啊

4

egg-bin 官方文档中 https://github.com/eggjs/egg-bin#options-2 写着 You can pass any mocha argv.--watch 是mocha 参数。 难道说 egg-bin test 不支持watch?写点代码,手动执行以下 egg-bin test 命令?

7

@zkboys 我本地测试一下,是支持 --watch 的。 可以自动监听文件变化

环境: node: v12.18.3 egg: 2.15.1 egg-bin: 4.11.0 system: window 10

6

helper.js 和 helper.test.js 改变都是可以出发测试运行,但是 helper.js 修改之后,测试代码运行不是最新的helper.js,像是有缓存一样,一直运行的是 启动 egg-bin test 命令时的 helper.js 代码。

9

@zkboys --watch 参数不会重启服务的, 只能监听文件变化,然后重新执行测试用例

9

如何才能做到重启服务?

5

因为你引入的是 bootstrap 里面的全局 app 应用没有被 mocha 清理掉。

可以试下:

const mock = require('egg-mock');
const assert = require('assert');

describe('test/app/controller/home.test.js', () => {
  let app;

  before(async () => {
    app = mock.app();
    await app.ready();
  });

  after(() => app && app.close());

  it('should GET /', async () => {
    return app.httpRequest()
      .get('/')
      .expect('hi, egg')
      .expect(200);
  });
});