2

edit: from another answer I decided to try upgrading from karma-webpack 3.0.5 to 4.0.0-rc.2, and I started getting actual errors. It started complaining that angular was not defined, and then I realized I was importing my home.spec.js file from the tests.bundle.spec file instead of relying on the context to import it (was doing this while debugging and forgot about it). After removing the extra import, my tests run successfully! I'll update this question with an answer once SO allows me to answer my own question.

I'm fairly certain that karma isn't even loading my test bundle file, although it seems that webpack creates the bundle.

I can't seem to see any console.logs from the tests.bundle.spec.js or home.spec.js files. When I have singleRun=false, and I check the console in the spawned Chrome window after a refresh (the tests should re-run), I see in the Network tab that the tests.bundle.spec.js file is loaded, but I see nothing in the console, and it's not referenced in the html file. The only scripts that are loaded in the html page are socket.io.js and karma.js.

edit: After opening the Debug page from Chrome, I do see my tests.bundle.spec.js bundle being loaded, but none of the included modules ever get run. I've put breakpoints into the test scripts, and even the tests.bundle.spec.js code (e.g. when setting the context for require) but none of the breakpoints ever get triggered. I must be missing something somewhere, because Karma never initializes any of these modules. I've even put breakpoints in the __webpack_require__ function, and they're not being triggered. So none of my modules are being required/imported.

Webpack definitely builds the module, and I see this in the output in the console from my yarn test command (which runs 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]

This is my structure/configuration

Structure:

-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);
    });
}

When my tests run, I get Executed 0 of 0 ERROR (0.001 secs / 0 secs)

robert.bo.roth
  • 1,343
  • 3
  • 14
  • 24

4 Answers4

3

For me this was an issue related to optimization.splitChunks. after I removed it from my karma-webpack-config my tests were found.

Johannes
  • 237
  • 1
  • 10
1

You need to put in karma.conf.js

callback: function(){window.__karma__.start()}
1

I came across the same issue while updating to webpack 5. Test execution: 0 of 0. While preparing to ask for support, I created a repo https://github.com/svenbluege/karma-with-webpack-5-test and found the solution here.

The fix is pretty simple. You need to disable the chunking like that:

 webpack: {
  // webpack configuration => makes karma-webpack work!
  optimization: {
    runtimeChunk: false,
    splitChunks: false
  },
  module: {
    rules: [

By default, karma-webpack has the chunking enabled. Thanks to Johannes for the hint (https://stackoverflow.com/a/55576353/1680552)!

Sven Bluege
  • 1,418
  • 1
  • 10
  • 19
0

Ended up fixing my own issue, sorry for the delay in updating the answer since the original post.

From another answer I decided to try upgrading from karma-webpack 3.0.5 to 4.0.0-rc.2, and I started getting actual errors. It started complaining that angular was not defined, and then I realized I was importing my home.spec.js file from the tests.bundle.spec file instead of relying on the context to import it (was doing this while debugging and forgot about it). After removing the extra import, my tests run successfully!

robert.bo.roth
  • 1,343
  • 3
  • 14
  • 24