diff --git a/cms/static/coffee/spec/main.coffee b/cms/static/coffee/spec/main.coffee index 87253d01f1..c5e69aaf24 100644 --- a/cms/static/coffee/spec/main.coffee +++ b/cms/static/coffee/spec/main.coffee @@ -283,6 +283,8 @@ while i < testFiles.length testFiles[i] = '/base/' + testFiles[i] + '.js' i++ -require testFiles, -> +# Jasmine has a global stack for creating a tree of specs. We need to load +# spec files one by one, otherwise some end up getting nested under others. +requireSerial testFiles, -> # start test run, once Require.js is done window.__karma__.start() diff --git a/cms/static/coffee/spec/main_squire.coffee b/cms/static/coffee/spec/main_squire.coffee index e2ab5fc35d..a3480f3516 100644 --- a/cms/static/coffee/spec/main_squire.coffee +++ b/cms/static/coffee/spec/main_squire.coffee @@ -202,6 +202,9 @@ i = 0 while i < testFiles.length testFiles[i] = '/base/' + testFiles[i] + '.js' i++ -require testFiles, -> + +# Jasmine has a global stack for creating a tree of specs. We need to load +# spec files one by one, otherwise some end up getting nested under others. +requireSerial testFiles, -> # start test run, once Require.js is done window.__karma__.start() diff --git a/cms/static/karma_cms.conf.js b/cms/static/karma_cms.conf.js index b315e2e962..a33692da00 100644 --- a/cms/static/karma_cms.conf.js +++ b/cms/static/karma_cms.conf.js @@ -82,7 +82,9 @@ var libraryFiles = [ {pattern: 'edx-pattern-library/js/afontgarde.js', included: false}, {pattern: 'edx-pattern-library/js/edx-icons.js', included: false}, {pattern: 'edx-pattern-library/js/**/*.js', included: false}, - {pattern: 'edx-ui-toolkit/js/**/*.js', included: false} + {pattern: 'edx-ui-toolkit/js/**/*.js', included: false}, + + {pattern: 'common/js/utils/require-serial.js', included: true} ]; // Paths to source JavaScript files diff --git a/cms/static/karma_cms_squire.conf.js b/cms/static/karma_cms_squire.conf.js index 7d6ec26748..bf6756dd57 100644 --- a/cms/static/karma_cms_squire.conf.js +++ b/cms/static/karma_cms_squire.conf.js @@ -68,7 +68,8 @@ var libraryFiles = [ pattern: 'xmodule_js/common_static/js/vendor/jQuery-File-Upload/js/jquery.fileupload-validate.js', included: false }, - {pattern: 'xmodule_js/common_static/js/vendor/requirejs/text.js', included: false} + {pattern: 'xmodule_js/common_static/js/vendor/requirejs/text.js', included: false}, + {pattern: 'common/js/utils/require-serial.js', included: true} ]; // Paths to source JavaScript files diff --git a/common/static/common/js/spec/main_requirejs.js b/common/static/common/js/spec/main_requirejs.js index eebe0a92b0..c859348826 100644 --- a/common/static/common/js/spec/main_requirejs.js +++ b/common/static/common/js/spec/main_requirejs.js @@ -178,7 +178,7 @@ testFiles[i] = '/base/' + testFiles[i]; } - require(testFiles, function () { + window.requireSerial(testFiles, function () { // start test run, once Require.js is done window.__karma__.start(); }); diff --git a/common/static/common/js/utils/require-serial.js b/common/static/common/js/utils/require-serial.js new file mode 100644 index 0000000000..c55b6bd628 --- /dev/null +++ b/common/static/common/js/utils/require-serial.js @@ -0,0 +1,23 @@ +/* +Helper function used to require files serially instead of concurrently. + */ +(function (window, require) { + 'use strict'; + + var requireModules = function (paths, callback, modules) { + // If all the modules have been loaded, call the callback. + if (paths.length === 0) { + return callback.apply(null, modules); + } + // Otherwise load the next one. + require([paths.shift()], function(module) { + modules.push(module); + requireModules(paths, callback, modules); + }); + }; + + window.requireSerial = function(paths, callback) { + requireModules(paths, callback, []); + }; + +}).call(this, window, require || RequireJS.require); diff --git a/common/static/karma_common_requirejs.conf.js b/common/static/karma_common_requirejs.conf.js index 475d869d3c..7590ff4694 100644 --- a/common/static/karma_common_requirejs.conf.js +++ b/common/static/karma_common_requirejs.conf.js @@ -46,7 +46,8 @@ var libraryFiles = [ {pattern: 'js/test/i18n.js', included: false}, {pattern: 'coffee/src/jquery.immediateDescendents.js', included: false}, {pattern: 'js/vendor/requirejs/text.js', included: false}, - {pattern: 'js/vendor/sinon-1.17.0.js', included: false} + {pattern: 'js/vendor/sinon-1.17.0.js', included: false}, + {pattern: 'common/js/utils/require-serial.js', included: true} ]; // Paths to source JavaScript files diff --git a/lms/static/js/spec/main.js b/lms/static/js/spec/main.js index 2439da0eb8..6bc5f9f481 100644 --- a/lms/static/js/spec/main.js +++ b/lms/static/js/spec/main.js @@ -770,7 +770,9 @@ testFiles[i] = '/base/' + testFiles[i]; } - require(testFiles, function () { + // Jasmine has a global stack for creating a tree of specs. We need to load + // spec files one by one, otherwise some end up getting nested under others. + window.requireSerial(testFiles, function () { // start test run, once Require.js is done window.__karma__.start(); }); diff --git a/lms/static/karma_lms.conf.js b/lms/static/karma_lms.conf.js index 9f8efa3caa..10634dd8da 100644 --- a/lms/static/karma_lms.conf.js +++ b/lms/static/karma_lms.conf.js @@ -73,7 +73,8 @@ var libraryFiles = [ {pattern: 'xmodule_js/common_static/js/vendor/slick.core.js', included: true}, {pattern: 'xmodule_js/common_static/js/vendor/slick.grid.js', included: true}, {pattern: 'xmodule_js/common_static/js/libs/jasmine-waituntil.js', included: true}, - {pattern: 'xmodule_js/common_static/js/libs/jasmine-extensions.js', included: true} + {pattern: 'xmodule_js/common_static/js/libs/jasmine-extensions.js', included: true}, + {pattern: 'common/js/utils/require-serial.js', included: true} ]; // Paths to source JavaScript files