由于 webpack 中的 css,Mocha 测试失败

IT技术 unit-testing reactjs mocha.js webpack webpack-dev-server
2021-03-27 23:28:37

我是 Mocha 的新手,我正在尝试用它来测试一个简单的 React 组件。如果 React 组件没有任何 CSS 样式,则测试将通过,但如果 R​​eact 组件中的标签包含任何 className,则会引发语法错误:

测试.react.js

import React from 'react';

export default class Testing extends React.Component {
  render() {
    return (
      <section>
        <form>
          <input type="text" />
        </form>
      </section>
    );
  }
}

测试.jsx

import {
  React,
  sinon,
  assert,
  expect,
  TestUtils
} from '../../test_helper';

import TestingSample from '../../../app/components/Testing.react.js';

describe('TestingSample component', function(){
    before('render and locate element', function(){
        var renderedComponent = TestUtils.renderIntoDocument(
            <TestingSample />
        );

        var inputComponent = TestUtils.findRenderedDOMComponentWithTag(
            renderedComponent, 'input'
        );

        this.inputElement = inputComponent.getDOMNode();
    });

    it('<input> should be of type "text"', function () {
        assert(this.inputElement.getAttribute('type') === 'text');
    });
})

测试将通过:

> mocha --opts ./test/javascripts/mocha.opts --compilers js:babel/register --recursive test/javascripts/**/*.jsx


  TestSample component
    ✓ <input> should be of type "text"


  1 passing (44ms)

在输入标签中添加 className 后,出现错误:

import React from 'react';
import testingStyle from '../../scss/components/landing/testing.scss';

export default class Testing extends React.Component {
  render() {
    return (
      <section>
        <form>
          <input type="text" className="testingStyle.color" placeholder="Where would you like to dine" />     
        </form>
      </section>
    );
  }
}

测试结果:

SyntaxError: /Users/../../../Documents/project/app/scss/components/landing/testing.scss: Unexpected token (1:0)
> 1 | .color {
    | ^
  2 |   color: red;
  3 | }

我已经在网上搜索过,但到目前为止还没有运气。我错过了什么吗?请帮助我或指出我正确的方向将不胜感激。我目前正在使用:
Node Express Server
React
React-router
Webpack
Babel
Mocha
Chai
Sinon
Sinon-Chai

6个回答

有一个babel/register样式钩子可以忽略样式导入:

https://www.npmjs.com/package/ignore-styles

安装它:

npm install --save-dev ignore-styles

运行没有样式的测试:

mocha --require ignore-styles

这里有一个要点,但我无法让它与 webpack 友好 ~ 导入一起工作 - gist.github.com/ryanseddon/e76fd16af2f8f4f4bed8
2021-06-08 23:28:37
这节省了我的一天。此修复程序也适用于伊斯坦布尔。谢谢!
2021-06-15 23:28:37
如果我也想测试我的风格怎么办?
2021-06-20 23:28:37

您可以使用 css 编译器运行 mocha,编译器 js 如下:

css-dnt-compiler.js

function donothing() {
  return null;
}

require.extensions['.css'] = donothing;
require.extensions['.less'] = donothing;
require.extensions['.scss'] = donothing;
// ..etc

并像这样运行 mocha 命令:

mocha --compilers js:babel-core/register,css:css-dnt-compiler.js --recursive
这个解决方案对我有用,你唯一需要确保的是你包含了正确的css-dnt-compiler文件路径,所以在我的情况下,我已经将它存储在test文件夹中,所以命令变成:mocha --compilers js:babel-core/register,css:test/css-dnt-compiler.js --recursive
2021-05-31 23:28:37
稍微简单一点,require.extensions['.scss'] = ()=>null; require.extensions['.css'] = ()=>null;但这个答案很完美
2021-06-10 23:28:37

我的回答和这里一样,这就是我过去在 Babel 6 上的工作

包.json

"scripts": {
  "test": "mocha --compilers js:babel-core/register 
          --require ./tools/testHelper.js 'src/**/*-spec.@(js|jsx)'",

工具/testHelper.js

// Prevent mocha from interpreting CSS @import files
function noop() {
  return null;
}

require.extensions['.css'] = noop;

这使您可以在 src 文件夹中与组件一起进行测试。您可以使用 require.extensions 添加任意数量的扩展。

效果很好。我已将所有 mocha 选项移至 mocha.opts 以使脚本干净。
2021-05-28 23:28:37
如果noop()返回{},您也可以使用它来模拟类名。因此,例如,如果您使用import styles from 'my.css',则可以styles.myClassName在测试套件中进行设置,并且引用相同 CSS module的 React 组件将看到这些值。这在 Enzyme 等测试框架中使用类选择器时非常有用
2021-05-30 23:28:37

由于您使用的是 webpack,因此当 webpack 在您的组件中遇到所需的 CSS/LESS/SASS/etc 文件时,请使用null-loader进行加载null通过 npm 安装,然后更新你的 webpack 配置以包含加载器:

{
    test: /(\.css|\.less|.\scss)$/,
    loader: 'null-loader'
}

显然,这会阻止您在实际应用程序中加载 CSS,因此您需要为使用此加载器的测试包单独设置 webpack 配置。

我试过了,好像不行。另外,我注意到错误不是由向组件添加 className 引起的。这是由于导入 css 文件造成的: import testingStyle from '../../scss/components/landing/testing.scss';
2021-06-08 23:28:37

对于那些寻找如何处理此问题的人jest- 您只需为样式文件添加一个处理程序:

// package.json
{
  "jest": {
    "moduleNameMapper": {
      "\\.(css|less|scss|sass)$": "<rootDir>/__mocks__/styleMock.js"
    }
  }
}

// __mocks__/styleMock.js
module.exports = {};

更多在这里