aboutsummaryrefslogtreecommitdiffstats
path: root/tests/lib
diff options
context:
space:
mode:
authorMichał Gołębiowski-Owczarek <m.goleb@gmail.com>2020-05-16 09:16:24 +0200
committerGitHub <noreply@github.com>2020-05-16 09:16:24 +0200
commite7a10c70ae75c741992afdda60a433be205fd85e (patch)
tree7c9f0d717f944107930608316ed346fbdf5f12c5 /tests/lib
parentf4ef03e57edd7e51cb134e902679c7bddc3daaee (diff)
downloadjquery-ui-e7a10c70ae75c741992afdda60a433be205fd85e.tar.gz
jquery-ui-e7a10c70ae75c741992afdda60a433be205fd85e.zip
Tests: Ensure no timers are running at the end of each test (#1920)
This helps fix issues that make tooltip tests sometimes fail when run against jQuery 3.2 or newer due to timing differences. Details: * Add the `moduleAfterEach` function ensuring no timers are running. * Attach this function via `common.testWidget`. * Attach this function to most test suites. * Add a tooltip test helper cleaning up leftover timers. * Rename legacy `setup`/`teardown` hooks to `beforeEach`/`afterEach`. Closes gh-1920
Diffstat (limited to 'tests/lib')
-rw-r--r--tests/lib/common.js7
-rw-r--r--tests/lib/helper.js25
2 files changed, 28 insertions, 4 deletions
diff --git a/tests/lib/common.js b/tests/lib/common.js
index 7d3b3db2a..dbb9eea8b 100644
--- a/tests/lib/common.js
+++ b/tests/lib/common.js
@@ -1,7 +1,8 @@
define( [
"qunit",
- "jquery" ],
-function( QUnit, $ ) {
+ "jquery",
+ "lib/helper"
+], function( QUnit, $, helper ) {
var exports = {};
@@ -66,7 +67,7 @@ function testBasicUsage( widget ) {
}
exports.testWidget = function( widget, settings ) {
- QUnit.module( widget + ": common widget" );
+ QUnit.module( widget + ": common widget", { afterEach: helper.moduleAfterEach } );
exports.testJshint( "/widgets/" + widget );
testWidgetDefaults( widget, settings.defaults );
diff --git a/tests/lib/helper.js b/tests/lib/helper.js
index 400d85489..2315c5e19 100644
--- a/tests/lib/helper.js
+++ b/tests/lib/helper.js
@@ -2,7 +2,12 @@ define( [
"jquery"
], function( $ ) {
-var exports = {};
+var exports = {},
+
+ // Store the old count so that we only assert on tests that have actually leaked,
+ // instead of asserting every time a test has leaked sometime in the past
+ oldActive = 0,
+ splice = [].splice;
exports.forceScrollableWindow = function( appendTo ) {
@@ -28,6 +33,24 @@ exports.onFocus = function( element, onFocus ) {
element.on( "focus", fn )[ 0 ].focus();
};
+/**
+ * Ensures that tests have cleaned up properly after themselves. Should be passed as the
+ * afterEach function on all modules' lifecycle object.
+ */
+exports.moduleAfterEach = function( assert ) {
+
+ // Check for (and clean up, if possible) incomplete animations/requests/etc.
+ if ( jQuery.timers && jQuery.timers.length !== 0 ) {
+ assert.equal( jQuery.timers.length, 0, "No timers are still running" );
+ splice.call( jQuery.timers, 0, jQuery.timers.length );
+ jQuery.fx.stop();
+ }
+ if ( jQuery.active !== undefined && jQuery.active !== oldActive ) {
+ assert.equal( jQuery.active, oldActive, "No AJAX requests are still active" );
+ oldActive = jQuery.active;
+ }
+};
+
return exports;
} );