diff options
author | Michał Gołębiowski-Owczarek <m.goleb@gmail.com> | 2020-05-16 09:16:24 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-05-16 09:16:24 +0200 |
commit | e7a10c70ae75c741992afdda60a433be205fd85e (patch) | |
tree | 7c9f0d717f944107930608316ed346fbdf5f12c5 /tests/lib | |
parent | f4ef03e57edd7e51cb134e902679c7bddc3daaee (diff) | |
download | jquery-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.js | 7 | ||||
-rw-r--r-- | tests/lib/helper.js | 25 |
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; } ); |