@@ -2419,23 +2419,19 @@ describe('make sure that we can create an injector outside of tests', function()
2419
2419
2420
2420
describe ( '`afterEach` clean-up' , function ( ) {
2421
2421
describe ( 'undecorated `$rootElement`' , function ( ) {
2422
- var jQuery = window . jQuery ;
2423
2422
var prevRootElement ;
2424
- var prevRemoveDataSpy ;
2425
2423
var prevCleanDataSpy ;
2426
2424
2427
2425
2428
2426
it ( 'should set up spies so the next test can verify `$rootElement` was cleaned up' , function ( ) {
2429
2427
module ( function ( $provide ) {
2430
2428
$provide . decorator ( '$rootElement' , function ( $delegate ) {
2431
- // Spy on `$rootElement.removeData()` and `jQuery.cleanData()`,
2432
- // so the next test can verify that they have been called as necessary
2433
2429
prevRootElement = $delegate ;
2434
- prevRemoveDataSpy = spyOn ( $delegate , 'removeData' ) . andCallThrough ( ) ;
2435
2430
2436
- if ( jQuery ) {
2437
- prevCleanDataSpy = spyOn ( jQuery , 'cleanData' ) . andCallThrough ( ) ;
2438
- }
2431
+ // Spy on `angular.element.cleanData()`, so the next test can verify
2432
+ // that it has been called as necessary
2433
+ prevCleanDataSpy = spyOn ( angular . element , 'cleanData' ) . andCallThrough ( ) ;
2434
+ // prevCleanDataSpy = mockCleanData([prevRootElement[0]]);
2439
2435
2440
2436
return $delegate ;
2441
2437
} ) ;
@@ -2451,51 +2447,35 @@ describe('`afterEach` clean-up', function() {
2451
2447
it ( 'should clean up `$rootElement` after each test' , function ( ) {
2452
2448
// One call is made by `testabilityPatch`'s `dealoc()`
2453
2449
// We want to verify the subsequent call, made by `angular-mocks`
2454
- // (Since `testabilityPatch` re-wrapps `$rootElement` and because jQuery returns a different
2455
- // object when re-wrapping, we don't capture the 1st call when using jQuery)
2456
- expect ( prevRemoveDataSpy . callCount ) . toBe ( jQuery ? 1 : 2 ) ;
2457
-
2458
- if ( jQuery ) {
2459
- // One call is made by `testabilityPatch`'s `dealoc()`
2460
- // We want to verify the subsequent call, made by `angular-mocks`
2461
- expect ( prevCleanDataSpy . callCount ) . toBe ( 2 ) ;
2462
-
2463
- var cleanUpElems = prevCleanDataSpy . calls [ 1 ] . args [ 0 ] ;
2464
- expect ( cleanUpElems . length ) . toBe ( 1 ) ;
2465
- expect ( cleanUpElems [ 0 ] [ 0 ] ) . toBe ( prevRootElement [ 0 ] ) ;
2466
- }
2450
+ expect ( prevCleanDataSpy . callCount ) . toBe ( 2 ) ;
2451
+
2452
+ var cleanUpElems = prevCleanDataSpy . calls [ 1 ] . args [ 0 ] ;
2453
+ expect ( cleanUpElems . length ) . toBe ( 1 ) ;
2454
+ expect ( cleanUpElems [ 0 ] ) . toBe ( prevRootElement [ 0 ] ) ;
2467
2455
} ) ;
2468
2456
} ) ;
2469
2457
2470
2458
2471
2459
describe ( 'decorated `$rootElement`' , function ( ) {
2472
- var jQuery = window . jQuery ;
2473
2460
var prevOriginalRootElement ;
2474
- var prevOriginalRemoveDataSpy ;
2475
2461
var prevRootElement ;
2476
- var prevRemoveDataSpy ;
2477
2462
var prevCleanDataSpy ;
2478
2463
2479
2464
2480
2465
it ( 'should set up spies so the next text can verify `$rootElement` was cleaned up' , function ( ) {
2481
2466
module ( function ( $provide ) {
2482
2467
$provide . decorator ( '$rootElement' , function ( $delegate ) {
2483
- // Mock `$rootElement` to be able to verify that the correct object is cleaned up
2484
- var mockRootElement = angular . element ( '<div></div>' ) ;
2485
-
2486
- // Spy on `$rootElement.removeData()` and `jQuery.cleanData()`,
2487
- // so the next test can verify that they have been called as necessary
2488
2468
prevOriginalRootElement = $delegate ;
2489
- prevOriginalRemoveDataSpy = spyOn ( $delegate , 'removeData' ) . andCallThrough ( ) ;
2490
2469
2491
- prevRootElement = mockRootElement ;
2492
- prevRemoveDataSpy = spyOn ( mockRootElement , 'removeData' ) . andCallThrough ( ) ;
2470
+ // Mock `$rootElement` to be able to verify that the correct object is cleaned up
2471
+ prevRootElement = angular . element ( '<div></div>' ) ;
2493
2472
2494
- if ( jQuery ) {
2495
- prevCleanDataSpy = spyOn ( jQuery , 'cleanData' ) . andCallThrough ( ) ;
2496
- }
2473
+ // Spy on `angular.element.cleanData()`, so the next test can verify
2474
+ // that it has been called as necessary
2475
+ prevCleanDataSpy = spyOn ( angular . element , 'cleanData' ) . andCallThrough ( ) ;
2476
+ // prevCleanDataSpy = mockCleanData([prevRootElement[0], prevOriginalRootElement[0]]);
2497
2477
2498
- return mockRootElement ;
2478
+ return prevRootElement ;
2499
2479
} ) ;
2500
2480
} ) ;
2501
2481
@@ -2511,33 +2491,43 @@ describe('`afterEach` clean-up', function() {
2511
2491
// This is a false alarm, because `angular-mocks` would have cleaned up in a subsequent
2512
2492
// `afterEach` block
2513
2493
prevOriginalRootElement . removeData ( ) ;
2514
- prevOriginalRemoveDataSpy . reset ( ) ;
2515
-
2516
- expect ( prevOriginalRemoveDataSpy . callCount ) . toBe ( 0 ) ;
2517
2494
} ) ;
2518
2495
} ) ;
2519
2496
2520
2497
2521
2498
it ( 'should clean up `$rootElement` (both original and decorated) after each test' , function ( ) {
2522
- // Only `angular-mocks` cleans up after the original `$rootElement`, not `testabilityPatch`
2523
- expect ( prevOriginalRemoveDataSpy . callCount ) . toBe ( 1 ) ;
2524
-
2525
2499
// One call is made by `testabilityPatch`'s `dealoc()`
2526
2500
// We want to verify the subsequent call, made by `angular-mocks`
2527
- // (Since `testabilityPatch` re-wrapps `$rootElement` and because jQuery returns a different
2528
- // object when re-wrapping, we don't capture the 1st call when using jQuery)
2529
- expect ( prevRemoveDataSpy . callCount ) . toBe ( jQuery ? 1 : 2 ) ;
2530
-
2531
- if ( jQuery ) {
2532
- // One call is made by `testabilityPatch`'s `dealoc()`
2533
- // We want to verify the subsequent call, made by `angular-mocks`
2534
- expect ( prevCleanDataSpy . callCount ) . toBe ( 2 ) ;
2535
-
2536
- var cleanUpElems = prevCleanDataSpy . calls [ 1 ] . args [ 0 ] ;
2537
- expect ( cleanUpElems . length ) . toBe ( 2 ) ;
2538
- expect ( cleanUpElems [ 0 ] [ 0 ] ) . toBe ( prevOriginalRootElement [ 0 ] ) ;
2539
- expect ( cleanUpElems [ 1 ] [ 0 ] ) . toBe ( prevRootElement [ 0 ] ) ;
2540
- }
2501
+ expect ( prevCleanDataSpy . callCount ) . toBe ( 2 ) ;
2502
+
2503
+ var cleanUpElems = prevCleanDataSpy . calls [ 1 ] . args [ 0 ] ;
2504
+ expect ( cleanUpElems . length ) . toBe ( 2 ) ;
2505
+ expect ( cleanUpElems [ 0 ] ) . toBe ( prevOriginalRootElement [ 0 ] ) ;
2506
+ expect ( cleanUpElems [ 1 ] ) . toBe ( prevRootElement [ 0 ] ) ;
2541
2507
} ) ;
2542
2508
} ) ;
2509
+
2510
+
2511
+ // Helpers
2512
+ function mockCleanData ( expectedNodes ) {
2513
+ var callIdx = - 1 ;
2514
+
2515
+ var cleanData_ = angular . element . cleanData ;
2516
+ var cleanDataSpy = spyOn ( angular . element , 'cleanData' ) . andCallFake ( function ( cleanUpElems ) {
2517
+ var expectedNode = expectedNodes [ ++ callIdx % expectedNodes . length ] ;
2518
+ var actualNode = cleanUpElems [ 0 ] ;
2519
+ if ( actualNode !== expectedNode ) {
2520
+ throw new Error ( 'Unexpected node for clean-up: ' + actualNode . outerHTML ) ;
2521
+ }
2522
+
2523
+ cleanData_ . apply ( angular . element , arguments ) ;
2524
+
2525
+ var data = angular . element ( actualNode ) . data ( ) ;
2526
+ if ( Object . keys ( data ) . length ) {
2527
+ throw new Error ( 'Data clean-up failed on: ' + actualNode . outerHTML ) ;
2528
+ }
2529
+ } ) ;
2530
+
2531
+ return cleanDataSpy ;
2532
+ }
2543
2533
} ) ;
0 commit comments