Npm 如何在使用第三方模块时测试项目';运输

Npm 如何在使用第三方模块时测试项目';运输,npm,react-native,mocha.js,babeljs,enzyme,Npm,React Native,Mocha.js,Babeljs,Enzyme,我正在尝试使用酶来测试我的React原生项目,并遵循了设置说明 这很好,我自己的代码被正确传输,但当我包含一个不传输代码的模块时(例如),我的测试拒绝运行,因为这些模块中的导入语句出错 我如何让巴贝尔传输这些模块,或者有没有其他方法让我的测试运行 更新 "scripts": { ... "test": "mocha --require test/init.js --recursive test/**/*.js" }, 似乎非传输的第三方模块与React-Native相当常

我正在尝试使用酶来测试我的React原生项目,并遵循了设置说明

这很好,我自己的代码被正确传输,但当我包含一个不传输代码的模块时(例如),我的测试拒绝运行,因为这些模块中的导入语句出错

我如何让巴贝尔传输这些模块,或者有没有其他方法让我的测试运行

更新

"scripts": {
    ...
    "test": "mocha --require test/init.js --recursive test/**/*.js"
  },
似乎非传输的第三方模块与React-Native相当常见,因为React-Native本身不传输

解决方案似乎是强制传输和使用react native mock的组合。

但是,由于NavigationExperimental没有被嘲笑,我在react本机路由器流量方面遇到了进一步的问题

相关链接包括:

如果我找到解决方案,我会在这里更新

更新2

我已经在下面列出了我当前的解决方法,以防有人发现它有用

您可以尝试创建自己的脚本来调用require钩子(顺便说一句,最好使用
babel register
包)并使用
only | ignore
选项:

//init.js
要求(“巴别塔登记簿”)({
仅:[
“/my app dir/src/***”,
“/my app dir/node_modules/react native router flux/***”,
]
});

不过,这通常是一种非常可疑的发布软件包的方式。这是假设
.babelrc
与包一起发布。即便如此,由于它引用的东西被称为
devDependencies
,您似乎需要手动进入它的文件夹并安装它们。

这是我的testHelper.js,用于处理react native-3th party模块

require('babel-polyfill');
require('react-native-mock/mock');

// require('babel-core/register')({
//   ignore: function(packageName) {
//     if (packageName.match(/node_modules/)) {
//       return !(packageName.match(/react-native-vector-icons/)
//         || packageName.match(/react-native-animatable/)
//         || packageName.match(/react-native-router-flux/)
//         || packageName.match(/react-native-tab-navigator/)
//       );
//     }
//     return false;
//   }
// });

var fs = require('fs');
var path = require('path');

function getBabelRC() {
  var rcpath = path.join(__dirname, '.babelrc');
  var source = fs.readFileSync(rcpath).toString();
  return JSON.parse(source);
}

var config = getBabelRC();

config.ignore = function(filename) {
  if (!(/\/node_modules\//).test(filename)) {
    console.log(filename, 'FALSE');
    return false; // if not in node_modules, we want to compile it
  } else if ((/\/node_modules\/react-native.*\//).test(filename)) {
    // its RN source code, so we want to compile it
    console.log(filename, 'FALSE');
    return false;
  } else {
    console.log(filename, 'TRUE');
    // it's in node modules and NOT RN source code
    return true;
  }
};

require("babel-register")(config);

global.__DEV__ = true;


// var chai = require('chai');
// var dirtyChai = require('dirty-chai');
// chai.use(dirtyChai);

import chai from 'chai';
import dirtyChai from 'dirty-chai';
// import chaiImmutable from 'chai-immutable';

chai.use(dirtyChai);
//chai.use(chaiImmutable);

import mockery from "mockery";

mockery.enable();
mockery.registerMock('./menu_burger.png', 0);
这是我的npm测试

"test": "node_modules/.bin/mocha --compilers js:babel-core/register --require testHelper.js **/__test__/*.js",

我当前的解决方案如下(假设当前不支持ReactNativeMock中的NavigationExperimental):

package.json

"scripts": {
    ...
    "test": "mocha --require test/init.js --recursive test/**/*.js"
  },
/test/init.js

require('react-native-mock/mock');

require("babel-register")({
    only: [
        "/node_modules/react-native-tab-navigator/*.js",
        "/node_modules/react-native-router-flux/*.js",
        "/node_modules/react-native-router-flux/src/*.js",
        "/node_modules/react-native-tabs/*.js",
        "/node_modules/react-native-button/*.js",
        "/node_modules/react-native-swipeout/*.js",
        "/app/**/*",
        "/test/**/*",
    ]
});

import mockery from 'mockery';
mockery.enable();
mockery.registerMock('react-native-router-flux', {Actions:{}});

您从npm安装了
react native router flux
?这不是ES5吗?@JMM是的。我只是需要再次检查,因为我现在直接从一个分支上拔下,但是是的,从NPM安装的是ES6。最近的一个更改PR被放弃,因此我正在寻找一个替代解决方案。进一步的调查显示,这似乎是React-Native模块的常见做法,因为React-Native本身并没有传输。
require('react-native-mock/mock');

require("babel-register")({
    only: [
        "/node_modules/react-native-tab-navigator/*.js",
        "/node_modules/react-native-router-flux/*.js",
        "/node_modules/react-native-router-flux/src/*.js",
        "/node_modules/react-native-tabs/*.js",
        "/node_modules/react-native-button/*.js",
        "/node_modules/react-native-swipeout/*.js",
        "/app/**/*",
        "/test/**/*",
    ]
});

import mockery from 'mockery';
mockery.enable();
mockery.registerMock('react-native-router-flux', {Actions:{}});