针对已编译的捆绑软件运行测试

时间:2018-08-11 11:42:19

标签: javascript unit-testing jestjs

作为 JS库的作者,我编译并发布以下格式的源代码:

  • commonJS(/lib/index.js
  • ES(/es/index.js
  • UMD(/dist/index.js

我的单元测试涵盖了我的源代码,并且我信任我的捆绑/编译工具来生成工作包。

然后我阅读了React团队的this enlightening post,他们解释说他们针对库的捆绑版本运行部分单元测试

他们引入了test-build-prod,它{strong>运行Jest ,并带有special configuration file,它可以在测试中替换原始导入声明,以使用笑话的moduleNameMapper option

这很酷,但在我的小型开源项目中进行复制有点让人不知所措。

在尝试之前,是否还有任何其他工具或更便携的解决方案?我应该考虑对编译后的捆绑软件运行与在源代码上运行的测试相同的测试吗?

1 个答案:

答案 0 :(得分:0)

我将分享我最终使用的解决方案,该解决方案与React团队采用的解决方案相同,但规模较小。

我添加了一个特殊的 npm脚本,该脚本针对具有不同 Jest配置的每个已编译捆绑包运行一次我的单元测试

{
    "test:bundles": "jest --config ./jest/es.config.js && jest --config ./jest/lib.config.js && jest --config ./jest/dist.config.js"
}

每个Jest配置文件扩展默认Jest配置,并声明一个moduleNameMapper对象和一个rootDir属性,例如:

// jest/lib.config.js
const pkg = require('../package.json');

module.exports = Object.assign({}, pkg.jest, {
  rootDir: '../',
  moduleNameMapper: {
    '/src/index$': '<rootDir>/lib/index', // path of "CommonJS" bundle
  },
});

moduleNameMapper将确保用于源代码的相同测试将针对导出的包运行 ,因为 Jest将转换导入语句< / strong>,例如:

import myLibrary from './src/index';
// transformed into:
import myLibrary from '../lib/index';

唯一需要注意的一点是通过moduleNameMapper正则表达式对测试需要重新映射的导入语句进行测试

如果import from './index'在测试文件中不够唯一,则可能会将其重写为import from '../src/index'