karma-webpack 不是 运行 测试
karma-webpack not running tests
编辑:从 我决定尝试从 karma-webpack 3.0.5 升级到 4.0.0-rc.2,但我开始遇到实际错误。它开始抱怨 angular 没有定义,然后我意识到我是从 tests.bundle.spec
文件导入我的 home.spec.js
文件而不是依赖上下文来导入它(在调试时这样做然后忘了它)。删除额外的导入后,我的测试 运行 成功了!一旦允许我回答我自己的问题,我会用答案更新这个问题。
我相当确定 karma 甚至没有加载我的测试包文件,尽管 webpack 似乎创建了包。
我似乎无法从 tests.bundle.spec.js
或 home.spec.js
文件中看到任何 console.logs。当我有 singleRun=false 时,我在刷新后检查生成的 Chrome window 中的控制台(测试应该重新 运行),我在网络选项卡中看到 tests.bundle.spec.js
文件已加载,但我在控制台中看不到任何内容,并且未在 html 文件中引用它。 html 页面中加载的唯一脚本是 socket.io.js
和 karma.js
.
编辑:从 Chrome 打开调试页面后,我确实看到我的 tests.bundle.spec.js
包正在加载,但是 none 包含的模块曾经 运行。我已经在测试脚本中放置了断点,甚至 tests.bundle.spec.js
代码(例如,当为 require 设置上下文时)但是断点的 none 会被触发。我一定是遗漏了什么地方,因为业力从不初始化这些模块中的任何一个。我什至在 __webpack_require__
函数中放置了断点,但它们没有被触发。所以 none 我的模块是 required/imported.
Webpack 确实构建了模块,我在 yarn test
命令(运行s karma start
)的控制台输出中看到了这一点:
Entrypoint src/tests.bundle.spec = vendors~src/tests.bundle.spec.bundle.js src/tests.bundle.spec.js
[./ sync recursive home\.spec\.js$] . sync home\.spec\.js$ 192 bytes {src/tests.bundle.spec} [built]
这是我的structure/configuration
结构:
-src
--app
---home
----home.js
----home.spec.js
--tests.bundle.spec.js
karma.conf.js
webpack.test.js
karma.conf.js
var webpackConfig = require('./webpack.test.js');
module.exports = function (config) {
process.env.BABEL_ENV = 'karma';
config.set({
basePath: '',
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
{
pattern: './src/tests.bundle.spec.js',
watched: false
}
],
// plugins
plugins: [
'karma-webpack',
'karma-jasmine',
'karma-sourcemap-loader',
'karma-chrome-launcher'
],
preprocessors: {
'./src/tests.bundle.spec.js': ['webpack', 'sourcemap']
},
// Webpack config
webpack: webpackConfig,
webpackServer: {
noInfo: false
},
reporters: ['progress'],
// web server port
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: [
'Chrome'
],
singleRun: false,
concurrency: Infinity
})
}
webpack.test.js
const webpack = require("webpack");
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devtool: 'eval-source-map',
entry: {
app: path.resolve(__dirname, './src/index.js')
},
output: {
path: path.resolve(__dirname, './build_app/'),
filename: 'app-[name].js',
chunkFilename: 'app-vendors.[chunkhash].js'
},
module: {
rules: [
// JavaScript source files for the LeadingReach application
{
test: /\.js$/,
exclude: /(node_modules)(\.spec\.js$)/,
rules : [
{
loader: 'babel-loader'
},
{
loader: 'eslint-loader',
options: {
emitError: true,
emitWarning: true,
failOnError: true,
globals: [
'_',
'angular',
'lrenums',
'readJSON'
]
}
}
]
},
// JavaScript test files
{
test: /\.spec.js$/,
exclude: /(node_modules)/,
use : [
'babel-loader'
]
},
// Templates (non-compiled)
{
test: /\.tpl.html$/,
exclude: /\.tpl.html2js$/,
loader: ['file-loader?name=[path][name].[ext]?[hash]', 'extract-loader', 'html-loader']
},
// LESS files
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
// CSS files
{
test: /\.css$/,
loader: ['style-loader', 'css-loader']
},
// Static files
{
test: /\.(jpe?g|gif|png|ico)$/,
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]',
outputPath: 'assets/images/'
}
}]
},
// Font files
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]',
outputPath: 'fonts/'
}
}]
}
]
},
optimization: {
namedChunks: true,
splitChunks: {
chunks: "all",
minSize: 0,
cacheGroups: {
vendors: {
test: /[\/]node_modules[\/]/,
priority: -10,
chunks: 'all',
minSize: 0
}
}
}
},
plugins: [
// Clean build_app folder
new CleanWebpackPlugin(['build_app'], {
// Write logs to console.
verbose: true,
// perform clean just before files are emitted to the output dir
// Default: false
beforeEmit: true
}),
// Create our index.php file
new HtmlWebpackPlugin({
template: './src/index.php',
filename: 'index.php',
inject: 'head' // place scripts in head because we bootstrap the app at the end of the body
}),
// Expose _ (underscoreJS) to the global scope
new webpack.ProvidePlugin({
_: 'underscore'
})
]
};
tests.bundle.spec.js
const context = require.context('./', true, /.+home\.spec\.js$/);
console.log('================WHEEEEEE==============');
console.log(context.keys());
/*
* For each file, call the context function that will require the file and load it up here.
*/
context.keys().forEach(function(key) {
context(key);
});
home.spec.js
// Import dependencies
console.log('============HELLOOOOOOO123123123123==============');
require('angular');
require('angular-mocks');
import './home.js';
console.log('============HELLOOOOOOO==============');
describe('home section', function () {
console.log('============HELLOOOOOOO222222==============');
it('should run test', inject(function () {
expect(1).toEqual(1);
});
}
当我测试 运行 时,我得到 Executed 0 of 0 ERROR (0.001 secs / 0 secs)
对我来说,这是一个与 optimization.splitChunks
有关的问题。在我从我的 karma-webpack-config 中删除它之后,我的测试被发现了。
你需要输入karma.conf.js
callback: function(){window.__karma__.start()}
最终解决了我自己的问题,很抱歉自最初 post 以来延迟更新答案。
根据另一个答案,我决定尝试从 karma-webpack 3.0.5 升级到 4.0.0-rc.2,但我开始收到实际错误。它开始抱怨 angular 没有定义,然后我意识到我是从 tests.bundle.spec 文件导入我的 home.spec.js 文件而不是依赖上下文来导入它(在调试时这样做然后忘了它)。删除额外导入后,我的测试 运行 成功!
我在更新到 webpack 5 时遇到了同样的问题。测试执行:0 次,共 0 次。在准备寻求支持时,我创建了一个 repo https://github.com/svenbluege/karma-with-webpack-5-test 并在此处找到了解决方案。
修复非常简单。您需要像这样禁用分块:
webpack: {
// webpack configuration => makes karma-webpack work!
optimization: {
runtimeChunk: false,
splitChunks: false
},
module: {
rules: [
默认情况下,karma-webpack 已启用分块。感谢 Johannes 的提示 ()!
编辑:从 tests.bundle.spec
文件导入我的 home.spec.js
文件而不是依赖上下文来导入它(在调试时这样做然后忘了它)。删除额外的导入后,我的测试 运行 成功了!一旦允许我回答我自己的问题,我会用答案更新这个问题。
我相当确定 karma 甚至没有加载我的测试包文件,尽管 webpack 似乎创建了包。
我似乎无法从 tests.bundle.spec.js
或 home.spec.js
文件中看到任何 console.logs。当我有 singleRun=false 时,我在刷新后检查生成的 Chrome window 中的控制台(测试应该重新 运行),我在网络选项卡中看到 tests.bundle.spec.js
文件已加载,但我在控制台中看不到任何内容,并且未在 html 文件中引用它。 html 页面中加载的唯一脚本是 socket.io.js
和 karma.js
.
编辑:从 Chrome 打开调试页面后,我确实看到我的 tests.bundle.spec.js
包正在加载,但是 none 包含的模块曾经 运行。我已经在测试脚本中放置了断点,甚至 tests.bundle.spec.js
代码(例如,当为 require 设置上下文时)但是断点的 none 会被触发。我一定是遗漏了什么地方,因为业力从不初始化这些模块中的任何一个。我什至在 __webpack_require__
函数中放置了断点,但它们没有被触发。所以 none 我的模块是 required/imported.
Webpack 确实构建了模块,我在 yarn test
命令(运行s karma start
)的控制台输出中看到了这一点:
Entrypoint src/tests.bundle.spec = vendors~src/tests.bundle.spec.bundle.js src/tests.bundle.spec.js
[./ sync recursive home\.spec\.js$] . sync home\.spec\.js$ 192 bytes {src/tests.bundle.spec} [built]
这是我的structure/configuration
结构:
-src
--app
---home
----home.js
----home.spec.js
--tests.bundle.spec.js
karma.conf.js
webpack.test.js
karma.conf.js
var webpackConfig = require('./webpack.test.js');
module.exports = function (config) {
process.env.BABEL_ENV = 'karma';
config.set({
basePath: '',
frameworks: ['jasmine'],
// list of files / patterns to load in the browser
files: [
{
pattern: './src/tests.bundle.spec.js',
watched: false
}
],
// plugins
plugins: [
'karma-webpack',
'karma-jasmine',
'karma-sourcemap-loader',
'karma-chrome-launcher'
],
preprocessors: {
'./src/tests.bundle.spec.js': ['webpack', 'sourcemap']
},
// Webpack config
webpack: webpackConfig,
webpackServer: {
noInfo: false
},
reporters: ['progress'],
// web server port
port: 9876,
colors: true,
logLevel: config.LOG_INFO,
autoWatch: false,
browsers: [
'Chrome'
],
singleRun: false,
concurrency: Infinity
})
}
webpack.test.js
const webpack = require("webpack");
const path = require('path');
const CleanWebpackPlugin = require('clean-webpack-plugin');
const HtmlWebpackPlugin = require('html-webpack-plugin');
module.exports = {
mode: 'development',
devtool: 'eval-source-map',
entry: {
app: path.resolve(__dirname, './src/index.js')
},
output: {
path: path.resolve(__dirname, './build_app/'),
filename: 'app-[name].js',
chunkFilename: 'app-vendors.[chunkhash].js'
},
module: {
rules: [
// JavaScript source files for the LeadingReach application
{
test: /\.js$/,
exclude: /(node_modules)(\.spec\.js$)/,
rules : [
{
loader: 'babel-loader'
},
{
loader: 'eslint-loader',
options: {
emitError: true,
emitWarning: true,
failOnError: true,
globals: [
'_',
'angular',
'lrenums',
'readJSON'
]
}
}
]
},
// JavaScript test files
{
test: /\.spec.js$/,
exclude: /(node_modules)/,
use : [
'babel-loader'
]
},
// Templates (non-compiled)
{
test: /\.tpl.html$/,
exclude: /\.tpl.html2js$/,
loader: ['file-loader?name=[path][name].[ext]?[hash]', 'extract-loader', 'html-loader']
},
// LESS files
{
test: /\.less$/,
use: ['style-loader', 'css-loader', 'less-loader']
},
// CSS files
{
test: /\.css$/,
loader: ['style-loader', 'css-loader']
},
// Static files
{
test: /\.(jpe?g|gif|png|ico)$/,
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]',
outputPath: 'assets/images/'
}
}]
},
// Font files
{
test: /\.(woff(2)?|ttf|eot|svg)(\?v=\d+\.\d+\.\d+)?$/,
use: [{
loader: 'file-loader',
options: {
name: '[name].[ext]?[hash]',
outputPath: 'fonts/'
}
}]
}
]
},
optimization: {
namedChunks: true,
splitChunks: {
chunks: "all",
minSize: 0,
cacheGroups: {
vendors: {
test: /[\/]node_modules[\/]/,
priority: -10,
chunks: 'all',
minSize: 0
}
}
}
},
plugins: [
// Clean build_app folder
new CleanWebpackPlugin(['build_app'], {
// Write logs to console.
verbose: true,
// perform clean just before files are emitted to the output dir
// Default: false
beforeEmit: true
}),
// Create our index.php file
new HtmlWebpackPlugin({
template: './src/index.php',
filename: 'index.php',
inject: 'head' // place scripts in head because we bootstrap the app at the end of the body
}),
// Expose _ (underscoreJS) to the global scope
new webpack.ProvidePlugin({
_: 'underscore'
})
]
};
tests.bundle.spec.js
const context = require.context('./', true, /.+home\.spec\.js$/);
console.log('================WHEEEEEE==============');
console.log(context.keys());
/*
* For each file, call the context function that will require the file and load it up here.
*/
context.keys().forEach(function(key) {
context(key);
});
home.spec.js
// Import dependencies
console.log('============HELLOOOOOOO123123123123==============');
require('angular');
require('angular-mocks');
import './home.js';
console.log('============HELLOOOOOOO==============');
describe('home section', function () {
console.log('============HELLOOOOOOO222222==============');
it('should run test', inject(function () {
expect(1).toEqual(1);
});
}
当我测试 运行 时,我得到 Executed 0 of 0 ERROR (0.001 secs / 0 secs)
对我来说,这是一个与 optimization.splitChunks
有关的问题。在我从我的 karma-webpack-config 中删除它之后,我的测试被发现了。
你需要输入karma.conf.js
callback: function(){window.__karma__.start()}
最终解决了我自己的问题,很抱歉自最初 post 以来延迟更新答案。
根据另一个答案,我决定尝试从 karma-webpack 3.0.5 升级到 4.0.0-rc.2,但我开始收到实际错误。它开始抱怨 angular 没有定义,然后我意识到我是从 tests.bundle.spec 文件导入我的 home.spec.js 文件而不是依赖上下文来导入它(在调试时这样做然后忘了它)。删除额外导入后,我的测试 运行 成功!
我在更新到 webpack 5 时遇到了同样的问题。测试执行:0 次,共 0 次。在准备寻求支持时,我创建了一个 repo https://github.com/svenbluege/karma-with-webpack-5-test 并在此处找到了解决方案。
修复非常简单。您需要像这样禁用分块:
webpack: {
// webpack configuration => makes karma-webpack work!
optimization: {
runtimeChunk: false,
splitChunks: false
},
module: {
rules: [
默认情况下,karma-webpack 已启用分块。感谢 Johannes 的提示 (