composeWith子生成器未按预期进行嘲笑吗?

时间:2019-02-23 08:30:24

标签: javascript node.js yeoman yeoman-generator

我正在尝试测试生成器,该生成器使用composeWith()依赖于子生成器generator-express

this.composeWith(require.resolve('generator-express/app'), {dirname: this.props.app_name, createDirectory: 'n'});

这是我对模拟虚拟发生器的测试摘录:

var deps = [
      [helpers.createDummyGenerator(), require.resolve('generator-express/app')]
];

describe('generator-cesium/app Test', () => {
    beforeEach(() => {
        return helpers.run(path.join(__dirname, '../generators/app'))
            .inDir(path.join(__dirname, 'tmp'))
            .withPrompts({
                viewerContext: '/',  // eslint-disable-line camelcase
                appName: 'app'       // eslint-disable-line camelcase
            })
            .withGenerators(deps)
    });
...

但是,我不断收到以下错误消息:

Error [ERR_UNHANDLED_ERROR]: Unhandled error. (TypeError: Cannot read property 'match' of undefined)

      at Immediate.setImmediate (node_modules/generator-express/node_modules/yeoman-generator/lib/index.js:406:18)

该错误表明子生成器仍在执行中,使我相信该模拟实际上并没有运行?

1 个答案:

答案 0 :(得分:0)

我认为deps数组仅适用于使用名称别名而不是路径名的旧式生成器。

我认为使用require.resolve()来模拟生成器的最简单方法是使用jest.mockproxyquiremockery之类的工具。

例如:

jest.mock('../generators/app', () => {
    const helpers = require('yeoman-test');
    helpers.createDummyGenerator();
});