Require/import 摩卡测试期间的 svg

Require/import svg during mocha tests

我有一个正在使用 webpack 构建的项目。这允许我导入 .svg 文件来创建 React 组件。

当 运行 测试时,我一直试图避免使用 webpack 以避免将 mocha 版本绑定到 webpack 插件。不幸的是,当 .svg 导入被命中时,它们找不到。我们也在使用 css 模块,它们允许我使用 css-modules-require-hook 来解决导入 css 文件的问题。

有没有一种技术可以用 SVG 来完成同样的事情?

是的,我只是找到了一种方法来为 mocha here 模拟 .svg 模块。

Mocha 可以使用 require hooks 来处理通用 javascript 导入,例如 babel-register for .js.

您可以使用 require-hacker 为模块的扩展添加挂钩。

您可以为其他组件加载器使用空反应组件模拟,例如 react-svg-loader.svg 作为反应组件加载。

示例如下:

import requireHacker from 'require-hacker';

const fakeComponentString = `
  require('react').createClass({
    render() {
      return null;
    }
  })
`;

// for fake component
requireHacker.hook('svg', path => `module.exports = ${fakeComponentString}`);

我看到通过使用 require.extensions(在节点中这是 deprecated,但永远不会消失)强制导入这些类型的资产以导致无操作来解决这个问题。使用 --require 标志启动 mocha 让我们为测试配置运行时环境,这样启动 mocha:

NODE_PATH=./app mocha -w --compilers js:babel-core/register --require ./app/lib/testHelper.js --require ./app/lib/testNullCompiler.js 'app/**/*.spec.@(js|jsx)' --watch-extensions js,jsx

其中 testNullCompiler.js 是:

const noop = () => 1;

require.extensions['.css'] = noop;
require.extensions['.scss'] = noop;
require.extensions['.png'] = noop;
require.extensions['.jpg'] = noop;
require.extensions['.jpeg'] = noop;
require.extensions['.gif'] = noop;
require.extensions['.svg'] = noop;

这将导致上述所有类型的文件都return noop 函数而不是尝试加载实际文件。

我的代码正在使用 es6 import 语法,但我假设 babel 正在将其转换为 require 在幕后,这使得该技术能够工作.