/ edit:我完全剥离了配置,以最小程度地说明了问题。我还向GitHub上传了一个可运行的项目,您可以检出该项目,因此您可以自己查看。
GitHub上有问题的用例:webpack-angular15-es6-karma(下载7z存档)
npm install
npm run build
npm run test
我知道有两个相关的问题,但是世界发展得如此之快,并且有太多的因素/依赖关系,以至于我无法用当前提出的解决方案来解决这个问题。
我有一个webpack配置,可以处理我的所有源代码,并且效果很好。
为了进行测试,我重用了该配置以处理一个单一的中央条目脚本,该脚本同时加载了源代码和测试文件。我找不到另一种将模块从源代码导入测试代码进行测试的方法。
Karma可以很好地重用我的webpack配置,但是浏览器一打开就会报告错误。
源代码使用ES6导入和webpack require语句。
package.json:
npm运行构建>>> webpack --config webpack.config.js --display-error-details --colors --progress
npm运行测试>>>业力启动-单次运行--no-auto-watch karma.config.js
{
"name": "ProblemDemo",
"scripts": {
"build": "rimraf dist && webpack --config webpack.config.js --display-error-details --colors --progress",
"test": "karma start --single-run --no-auto-watch karma.config.js"
},
"dependencies": {
"angular": "^1.5.7",
"angular-filter": "^0.5.8"
},
"devDependencies": {
"webpack": "1.13.1",
"html-loader": "0.4.3",
"babel-loader": "5.3.2",
"html-webpack-plugin": "1.6.1",
"rimraf": "^2.5.3",
"run-sequence": "1.1.2",
"jasmine-core": "^2.4.1",
"karma": "^0.13.19",
"karma-chrome-launcher": "^0.2.2",
"karma-coverage": "^0.5.3",
"karma-jasmine": "^0.3.6",
"karma-webpack": "^1.7.0",
"loader-utils": "^0.2.12"
}
}
karma.config.js:
module.exports = function (config) {
config.set({
browsers: ['Chrome'],
coverageReporter: {
reporters: [
{ type: 'html', subdir: 'html' },
{ type: 'lcovonly', subdir: '.' }
]
},
files: ['./tests.webpack.js'],
frameworks: ['jasmine'],
preprocessors: { './tests.webpack.js': ['webpack'] },
reporters: ['progress', 'coverage'],
webpack: configureWebpack()
});
function configureWebpack(webpackConfigFunction) {
var webpackConfig = require('./webpack.config');
webpackConfig.entry = undefined; // karma will pass the proper argument for entry
return webpackConfig;
}
};
如您所见,我没有使用karma-babel插件:我不确定为什么会需要这些插件,因为我已经有了一个具有import / require语句的代码的有效构建。
test_entry.js:
var testsContext = require.context('./test', true, /\.js$/);
testsContext.keys().forEach(testsContext);
var srcContext = require.context('./app', true, /\.js$/);
srcContext.keys().forEach(srcContext);
Webpack的构建成功完成(并发出预期的文件大小的test_entry.js块),但是随后Karma打开Chrome,并且在页面加载后立即出现以下错误:
Chrome 51.0.2704(Windows 7 0.0.0)错误
未捕获到的SyntaxError:意外的令牌导入
在the_path / test_entry.js:41
test_entry.js没有41行,也不包含import语句,无论如何它们都应该得到照顾。怎么了
如果您也想了解webpack的配置:
// webpack.config.js, works perfectly for normal builds but not with Karma
var path = require('path');
var webpack = require('webpack');
var HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
debug: true,
entry: {
app: ['./app/index.js'],
vendor: ['./app/vendor.js']
},
output: {
path: path.join(__dirname, 'dist'),
filename: 'js/[name].js'
},
plugins: [
new HtmlWebpackPlugin({
template: './app/index.html',
inject: 'body',
minify: false
}),
new webpack.optimize.CommonsChunkPlugin('vendor', 'js/vendor.js'),
new webpack.SourceMapDevToolPlugin({
filename: '[file].map',
exclude: /vendor/
})
],
resolve: {
extensions: ['', '.js'],
alias: {
app: path.join(__dirname, 'app')
}
},
module: {
loaders: [
{
test: /\.js$/,
loader: 'babel-loader',
include: path.join(__dirname, 'app'),
exclude: path.join(__dirname, 'node_modules')
},
{
test: /\.html$/,
loader: 'html-loader'
}
]
},
resolveLoader: {
root: path.join(__dirname, 'node_modules')
},
};
如果您想查看test_entry.js所需的测试,我将无法运行它:
import jasmine from 'jasmine-core';
import readableNumberFilter from './file_path/readableNumber.filter';
// for some reason needed, or else unexpected token errors during build:
var describe = jasmine.describe;
var it = jasmine.it;
var expect = jasmine.expect;
describe('readableNumber Filter', function () {
describe('readableNumber Filter formatting', () => {
it('it should support optional arguments', function () {
expect(readableNumberFilter("50.3")).toEqual("50,30");
});
});
});
编辑20-7-2016
更新后的babel-loader依赖关系仍然存在此问题(包括设置es2015预设选项)。“ babel-core”:“ ^ 6.11.4”,“ babel-loader”:“ ^ 6.2.4”,“ babel-preset-es2015”:“ ^ 6.9.0”,
问题是您没有在转储测试源-src/global/filters/dateFormat.filter.spec.js
未转储文件。
您需要更改此加载器配置:
{
test: /\.js$/,
loader: 'babel-loader',
include: path.join(__dirname, 'app'),
exclude: path.join(__dirname, 'node_modules')
},
如下所示,使其工作:
{
test: /\.js$/,
loader: 'babel-loader',
include: [
path.join(__dirname, 'app'),
path.join(__dirname, 'test')
],
exclude: path.join(__dirname, 'node_modules')
},
webpack.optimize.CommonsChunkPlugin
插件也存在问题-应禁用业力:https://github.com/webpack/karma-webpack/issues/22
比禁用此插件后,您的测试文件中有错误:
import jasmine from 'jasmine-core';
import readableNumberFilter from 'readableNumber.filter';
var describe = jasmine.describe;
var it = jasmine.it;
var expect = jasmine.expect;
describe('readableNumber Filter', function () {
describe('readableNumber Filter formatting', () => {
it('it should support optional arguments', function () {
expect(readableNumberFilter("50.3")).toEqual("50,30");
});
});
});
此测试中几乎没有错误:
import jasmine from 'jasmine-core';
-你不应该这样做(因缘会做,也将增加describe
,it
和expect
)import readableNumberFilter from 'readableNumber.filter';
-这不是您如何实例化角度服务以对其进行测试的方法。您应该执行以下操作(此测试实际上适用于上述所有修复程序):
import angular from 'angular';
import 'angular-mocks';
import testModule from '../../../../app/src/global/index';
const { module, inject } = angular.mock;
describe('readableNumber Filter', () => {
beforeEach(module(testModule));
let $filter;
beforeEach(inject((_$filter_) => {
$filter = _$filter_;
}));
describe('readableNumber Filter formatting', () => {
it('it should support optional arguments', () => {
const result = $filter('readableNumber')("50.3");
expect(result).toEqual("50,30");
});
});
});
注意:您将需要安装模块angular-mocks
;
为了支持代码覆盖率报告,您将需要配置测试Webpack配置以使用babel-istanbul-loader
。顺便说一句,您还需要升级到Babel6。
另外,您还需要使webpack配置更具可配置性(用于测试和生产的配置会稍有不同)。
我已向您发送了包含所有这些修复程序的请求请求:https : //github.com/bbottema/webpack-angular15-es6-karma/pull/1
关于使用webpack构建angular 1.x项目,包括通过业力进行代码覆盖率测试-也许您会对我的项目感兴趣:https : //github.com/zxbodya/angular-webpack-seed-这是具有所有必需条件的入门模板配置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句