如何测试私有React组件

时间:2017-02-17 18:25:43

标签: javascript reactjs ecmascript-6

我最近在那里做了一个不使用ES6的工作。我有一个ES6背景,只是写了一个大文件,我无法弄清楚如何在不使用ES6的情况下进行测试。

基本上,我有一个主要组件,它有大约7个左右的私有组件,它们大多是作为可读性,测试和性能的独立组件构建的。 (能够对私有组件进行应用组件更新是一个巨大的推动力)

这是我的问题:

没有导出我的私有组件我找不到一种方法来编写测试它们。

因为我们没有使用ES6,所以我不能使用

export default MyComponent
export PrivateComponent1
export PrivateComponent2

语法,我知道从单个文件导出多个组件的唯一方法是使用

exports.MyComponent = MyComponent
exports.PrivateComponent1 = PrivateComponent1
exports.PrivateComponent2 = PrivateComponent2

然而这并不好,因为在require语句中我需要使用

const MyComponent = require('MyComponent').MyComponent

理想情况下,我想使用类似的东西:

module.exports = MyComponent
exports.PrivateComponent1 = PrivateComponent1
exports.PrivateComponent2 = PrivateComponent2

但这似乎没有效果。

此外,最好不要将其分解为单独的文件。

...这就是我没有做TDD的原因:(

1 个答案:

答案 0 :(得分:1)

CommonJS Modules

module.exports = MyComponent
exports.PrivateComponent1 = PrivateComponent1
exports.PrivateComponent2 = PrivateComponent2

这是不可能的,因为exportsmodule.exports的别名,设置module.exports后,exports中的属性将不会被导出。

发布者(Babel)做的是创建“默认”属性。

ES2015

所以,ES2015中的以下代码:

import AnotherModule from './anotherModule';

export default class Foo {}

export class Bar {}

将被翻译成:

'use strict';

Object.defineProperty(exports, "__esModule", {
  value: true
});
exports.Bar = undefined;

var _anotherModule = require('./anotherModule');

var _anotherModule2 = _interopRequireDefault(_anotherModule);

function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }

function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }

var Foo = function Foo() {
  _classCallCheck(this, Foo);
};

exports.default = Foo;

var Bar = exports.Bar = function Bar() {
  _classCallCheck(this, Bar);
};

注意第exports.default = Foo;行和var Bar = exports.Bar = ...行。

为了在不使用ES2015(既不是转换器)的情况下将该模块导入另一个文件,您使用var Foo = require('./myPreviousModule').default

Babel创建一个互操作函数(请参阅函数_interopRequireDefault),以允许用户以相同的方式导入Node CommonJS模块和ES2015模块。