node.js - Kan inte hitta modul "module" - Rewire.js
Jag försöker använda rewire med mina Karma (Webpack + Typescript) enhetstester. Mina enhetstester är skrivna i Typescript, bundlade med Webpack och körs sedan med Karma. Jag får hela tiden felmeddelandet:
PhantomJS 2.1.1 (Windows 7 0.0.0) ERROR
Error: Cannot find module "module"
at src/myTest.spec.ts:187
Jag tittade på koden för Rewire, och problemet kommer från raden
var Module = require("module"),
Jag vet att det finns ett Webpack Rewire-plugin, men när jag använder det har jag samma problem som redan rapporterats i ett ärende.
Alla mina tester som inte använder rewire fungerar bra.
Här är min testfil:
import rewire = require("rewire");
const decorators = rewire("./decorators");
describe('something', () => {
it('should do something', () => {
decorators.__set__('Test', () => 'hello');
// In know this is pointless, but it's just to make sure that rewire works.
expect(decorators.Test).toBe('hello');
});
});
Här är min webpack-konfiguration:
var webpack = require('webpack');
var path = require('path');
var fs = require('fs');
var nodeModules = {};
fs.readdirSync('node_modules')
.filter(function (x) {
return ['.bin'].indexOf(x) === -1;
})
.forEach(function (mod) {
nodeModules[mod] = 'commonjs ' + mod;
});
// Our Webpack Defaults
var webpackConfig = {
entry: './src/index.ts',
target: 'node',
module: {
loaders: [
{test: /\.ts$/, loaders: ['ts-loader'], exclude: /node_modules/}
]
},
plugins: [
new webpack.BannerPlugin({banner: 'require("source-map-support").install();', raw: true, entryOnly: false}),
new webpack.optimize.UglifyJsPlugin({sourceMap: true}),
new webpack.optimize.AggressiveMergingPlugin(),
],
output: {
path: path.resolve(__dirname, './dist'),
filename: 'index.js',
sourceMapFilename: 'index.map'
},
externals: nodeModules,
devtool: 'source-map',
resolve: {
extensions: ['.ts', '.js']
}
};
module.exports = webpackConfig;
och här är min (den relevanta) del av min karma.conf.js:
frameworks: ['jasmine'],
files: [
'src/**/*.spec.ts',
'test/**/*.ts'
],
exclude: [],
webpack: {
devtool: webpackConfig.devtool,
module: webpackConfig.module,
resolve: webpackConfig.resolve,
},
webpackMiddleware: {
quiet: true,
stats: {
colors: true
}
},
preprocessors: {
'src/**/*.spec.ts': ['webpack', 'sourcemap'],
'test/**/*.ts': ['webpack', 'sourcemap']
},
Svar #1
Jag tror att du skriver detta fel import rewire=require("rewire");
det borde vara
import rewire from 'rewire'
för ES6 eller
const rewire = require('rewire')
för ES5
Svar #2
Att skriva om skriptet i package.json fungerade för mig:
"test": "ts-node -O '{\"module\":\"commonjs\"}' node_modules/jest/bin/jest.js"
Om du får felet
SyntaxError: Oväntat tecken ' i JSON vid position 0
det löste det för mig:
ts-node -O \"{""module"":""commonjs""}\" node_modules/jest/bin/jest.js
Det var inte min idé. Se detta svar på ett Github-ärende för en bra förklaring.
