Utilisation des alias webpack dans les tests mocha
je développe une application web au travail dans React/Redux/Webpack et je commence maintenant à intégrer des tests avec Mocha.
j'ai suivi les instructions pour écrire des tests dans la documentation Redux , mais maintenant j'ai rencontré un problème avec mes alias webpack.
par exemple, jetez un oeil à la section importations de ce test pour l'un de mes créateurs d'action:
import expect from 'expect' // resolves without an issue
import * as actions from 'actions/app'; // can't resolve this alias
import * as types from 'constants/actionTypes'; // can't resolve this alias
describe('Actions', () => {
describe('app',() => {
it('should create an action with a successful connection', () => {
const host = '***************',
port = ****,
db = '******',
user = '*********',
pass = '******';
const action = actions.createConnection(host, port, db, user, pass);
const expectedAction = {
type: types.CREATE_CONNECTION,
status: 'success',
payload: { host, port, database, username }
};
expect(action).toEqual(expectedAction);
});
});
});
comme le suggèrent les commentaires, mocha n'est pas capable de résoudre mes déclarations d'importation quand elles font référence à des dépendances aliasées.
parce que je suis encore nouveau sur webpack, voici mon webpack.config.js
:
module.exports = {
devtool: 'eval-source-map',
entry: [
'webpack-hot-middleware/client',
'./src/index'
],
output: {
path: path.join(__dirname, 'dist'),
filename: 'bundle.js',
publicPath: '/static/'
},
resolve: {
extensions : ['', '.js', '.jsx'],
alias: {
actions: path.resolve(__dirname, 'src', 'actions'),
constants: path.resolve(__dirname, 'src', 'constants'),
/* more aliases */
}
},
plugins: [
new webpack.optimize.OccurenceOrderPlugin(),
new webpack.HotModuleReplacementPlugin(),
new webpack.NoErrorsPlugin()
],
module: {
loaders: [{
test: /.js$/,
loaders: ['babel'],
exclude: /node_modules/,
include: __dirname
}]
}
};
aussi, j'utilise la commande npm test
pour lancer mocha, voici le script que j'utilise dans mon package.json
.
{
"scripts": {
"test": "mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
}
}
donc voilà où je suis coincé. j'ai besoin d'inclure les alias de webpack dans mocha quand il s'exécute.
8 réponses
Ok, donc j'ai réalisé que tout ce que j'appelais était dans le répertoire src/
, donc j'avais simplement besoin de modifier mon script npm run test
.
{
"scripts": {
"test": "NODE_PATH=./src mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
}
}
ne marchera probablement pas pour tout le monde, mais ça a résolu mon problème.
vous pouvez aussi utiliser un plugin babel que j'ai écrit:
https://github.com/trayio/babel-plugin-webpack-alias
Il convertira votre chemin aliasé en chemins relatifs simplement en incluant un plugin babel dans votre .babelrc
.
j'ai aussi rencontré le même problème, mais avec ce plugin, je l'ai résolu.
https://www.npmjs.com/package/babel-plugin-webpack-aliases
la commande d'exécution de votre" mocha "ne lit pas le webpack.config.js
, il ne peut donc pas résoudre l'alias.
En paramétrant ce plugin, considérez webpack.config.js
lors de la compilation avec "babel-core/register". En conséquence, l'alias sera également valable lors de test.
npm i -D babel-plugin-webpack-aliases
et ajouter ce paramètre à .babelrc
{
"plugins": [
[ "babel-plugin-webpack-aliases", { "config": "./webpack.config.js" } ]
]
}
la réponse de Danny est géniale. Mais ma situation est un peu différente.
J'ai utilisé le resolve.alias
de webpack pour utiliser tous les fichiers du dossier src
.
resolve: {
alias: {
'-': path.resolve(__dirname, '../src'),
},
},
et utiliser un préfixe spécial pour mes propres modules comme celui-ci:
import App from '-/components/App';
pour tester un code comme celui-ci
Je dois ajouter une commande ln -sf src test/alias/-
avant le test mocha et utiliser le NODE_PATH=./test/alias
truc Danny camp up avec. Donc le script final serait comme ceci:
{
"scripts": {
"test": "ln -sf src test/alias/-; NODE_PATH=./test/alias mocha ./src/**/test/spec.js --compilers js:babel-core/register --recursive"
}
}
PS:
j'ai utilisé -
parce que beautifal charactors comme @
ou ~
ne sont pas assez sûres. J'ai trouvé la réponse pour les caractères sûrs ici
je pense que j'ai résolu ce problème. Vous devez utiliser 2 paquet: mock-exiger et proxyquire .
si vous avez un fichier js comme ceci:
app.js
import action1 from 'actions/youractions';
export function foo() { console.log(action1()) };
et votre code de test devrait écrire comme ceci:
app.test.js
import proxyquire from 'proxyquire';
import mockrequire from 'mock-require';
before(() => {
// mock the alias path, point to the actual path
mockrequire('actions/youractions', 'your/actual/action/path/from/your/test/file');
// or mock with a function
mockrequire('actions/youractions', {actionMethod: () => {...}));
let app;
beforeEach(() => {
app = proxyquire('./app', {});
});
//test code
describe('xxx', () => {
it('xxxx', () => {
...
});
});
file tree
app.js
|- test
|- app.test.js
moquez D'abord le chemin d'alias par mock-require dans la fonction before, et moquez votre objet test par proxyquire dans la fonction beforeEach.
j'ai eu exactement le même problème. Il semble impossible d'utiliser les alias webpack dans require.js ou dans le besoin de noeud.
j'ai finalement utilisé mock-require dans les essais unitaires et j'ai simplement remplacé les chemins manuellement, comme ceci:
var mock = require('mock-require');
mock('actions/app', '../../src/actions/app');
mock-require est un bon outil, parce que très probablement vous aimeriez mock la plupart de vos dépendances de toute façon au lieu d'utiliser les scripts actuels de src
.
je suppose que vous auriez --require babel-register
dans votre mocha.opts
. Vous pouvez utiliser babel module de résolution plugin https://github.com/tleunen/babel-plugin-module-resolver . Cela vous permet de définir des alias .babelrc, similaire à votre pseudonyme webpack:
{
"plugins": [
["module-resolver", {
"alias": {
"actions": "./src/actions",
"constants": "./src/constants"
}
}]
]
}
pour conserver les alias à un endroit comme config/webpack.common.js
resolve: {
alias: {
'~': path.resolve(__dirname, './../src/app')
}
}
puis installer babel-plugin-webpack-alias
npm i babel-plugin-webpack-alias --save-dev
puis dans .babelrc
:
{
"presets": ["env"],
"plugins": [
["babel-plugin-webpack-alias", {
"config": "./config/webpack.common.js" // path to your webpack config
}]
]
}