Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/424.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何测试私有组件_Javascript_Reactjs_Ecmascript 6 - Fatal编程技术网

Javascript 如何测试私有组件

Javascript 如何测试私有组件,javascript,reactjs,ecmascript-6,Javascript,Reactjs,Ecmascript 6,我最近在react项目中接受了一份尚未使用ES6的工作。我有ES6的背景,刚刚写了一个大文件,不使用ES6我就不知道如何测试 基本上,我有一个主组件,它有大约7个私有组件,这些组件主要是作为独立组件构建的,用于可读性、测试和性能。能够对私有组件进行应有的组件更新是一个巨大的提升 这是我的问题: 如果不导出我的私有组件,我就找不到编写测试的方法 因为我们没有使用ES6,所以我不能使用 export default MyComponent export PrivateComponent1 expor

我最近在react项目中接受了一份尚未使用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的原因:

CommonJS模块 这是不可能的,因为导出是module.exports的别名,并且在设置module.exports后,将不会导出导出中的属性

Transpiler所做的是创建一个默认属性

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=导出。Bar=

为了在不使用ES2015和transpiler的情况下将该模块导入到另一个文件中,您可以使用var Foo=require'./myPreviousModule'.default


Babel创建了一个互操作函数,请参见函数_interopRequireDefault,以允许用户以相同的方式导入节点CommonJS模块和ES2015模块

为什么一个文件中有多个组件?理想情况下,您可以将每个组件抽象到其自己的文件中,即使它只被另一个组件使用。抽象层有其自身的优点,另外,您可以单独导出每个组件,而不必处理多个导出一个文件的问题。组件可以变得非常精细,我相信这确实有助于可读性、性能和调试。他们不想用一堆较小的组件污染文件夹。在这种情况下,我认为您唯一的选择是导出一个具有键/值对的对象,并且必须执行const MyComponent=require'MyComponent'。MyComponentHmm。。。我很害怕,这对他们来说也不是一个选择。解决方案是不将其分解为私有组件,而是将所有jsx放在父渲染函数中。我有点沮丧,我的可读性不是很好,现在:这是一个伟大的答案,所以简短的回答是,没有魔术可以做我真正想要的。他们会抱怨使用.default,但这是一些很好的信息,告诉我为什么我不能做我想做的事。谢谢
'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);
};