docs: drop `newEvent()` compatibility function (#37251)

Because PhantomJS has been deprecated since March 2018, and `newEvent`
is very confusing for newcomers that read the testing documentation,
we remove it entirely, and instead assume most, if not all, newcomers
will run tests in Chrome as it is the default.

Fixes #23370

PR Close #37251
This commit is contained in:
Adrien Crivelli 2020-07-09 12:46:27 +03:00 committed by Misko Hevery
parent dd8d8c8289
commit c4b8964424
5 changed files with 36 additions and 30 deletions

View File

@ -28,7 +28,7 @@ import {
ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync
} from '@angular/core/testing'; } from '@angular/core/testing';
import { addMatchers, newEvent, click } from '../../testing'; import { addMatchers, click } from '../../testing';
export class NotProvided extends ValueService { /* example below */ } export class NotProvided extends ValueService { /* example below */ }
beforeEach(addMatchers); beforeEach(addMatchers);
@ -274,9 +274,11 @@ describe('demo (with TestBed):', () => {
expect(comp.name).toBe(expectedOrigName, expect(comp.name).toBe(expectedOrigName,
`comp.name should still be ${expectedOrigName} after value change, before binding happens`); `comp.name should still be ${expectedOrigName} after value change, before binding happens`);
// dispatch a DOM event so that Angular learns of input value change. // Dispatch a DOM event so that Angular learns of input value change.
// then wait while ngModel pushes input.box value to comp.name // then wait while ngModel pushes input.box value to comp.name
input.dispatchEvent(newEvent('input')); // In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
input.dispatchEvent(new Event('input'));
return fixture.whenStable(); return fixture.whenStable();
}) })
.then(() => { .then(() => {
@ -312,9 +314,11 @@ describe('demo (with TestBed):', () => {
expect(comp.name).toBe(expectedOrigName, expect(comp.name).toBe(expectedOrigName,
`comp.name should still be ${expectedOrigName} after value change, before binding happens`); `comp.name should still be ${expectedOrigName} after value change, before binding happens`);
// dispatch a DOM event so that Angular learns of input value change. // Dispatch a DOM event so that Angular learns of input value change.
// then wait a tick while ngModel pushes input.box value to comp.name // then wait a tick while ngModel pushes input.box value to comp.name
input.dispatchEvent(newEvent('input')); // In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
input.dispatchEvent(new Event('input'));
tick(); tick();
expect(comp.name).toBe(expectedNewName, expect(comp.name).toBe(expectedNewName,
`After ngModel updates the model, comp.name should be ${expectedNewName} `); `After ngModel updates the model, comp.name should be ${expectedNewName} `);
@ -335,10 +339,12 @@ describe('demo (with TestBed):', () => {
// simulate user entering new name in input // simulate user entering new name in input
input.value = inputText; input.value = inputText;
// dispatch a DOM event so that Angular learns of input value change. // Dispatch a DOM event so that Angular learns of input value change.
// then wait a tick while ngModel pushes input.box value to comp.text // then wait a tick while ngModel pushes input.box value to comp.text
// and Angular updates the output span // and Angular updates the output span
input.dispatchEvent(newEvent('input')); // In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
input.dispatchEvent(new Event('input'));
tick(); tick();
fixture.detectChanges(); fixture.detectChanges();
expect(span.textContent).toBe(expectedText, 'output span'); expect(span.textContent).toBe(expectedText, 'output span');

View File

@ -3,7 +3,7 @@ import { ComponentFixture, fakeAsync, inject, TestBed, tick, waitForAsync } from
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { import {
ActivatedRoute, ActivatedRouteStub, asyncData, click, newEvent ActivatedRoute, ActivatedRouteStub, asyncData, click
} from '../../testing'; } from '../../testing';
import { Hero } from '../model/hero'; import { Hero } from '../model/hero';
@ -99,7 +99,10 @@ function overrideSetup() {
const newName = 'New Name'; const newName = 'New Name';
page.nameInput.value = newName; page.nameInput.value = newName;
page.nameInput.dispatchEvent(newEvent('input')); // tell Angular
// In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
page.nameInput.dispatchEvent(new Event('input')); // tell Angular
expect(component.hero.name).toBe(newName, 'component hero has new name'); expect(component.hero.name).toBe(newName, 'component hero has new name');
expect(hdsSpy.testHero.name).toBe(origName, 'service hero unchanged before save'); expect(hdsSpy.testHero.name).toBe(origName, 'service hero unchanged before save');
@ -197,9 +200,10 @@ function heroModuleSetup() {
// simulate user entering a new name into the input box // simulate user entering a new name into the input box
nameInput.value = 'quick BROWN fOx'; nameInput.value = 'quick BROWN fOx';
// dispatch a DOM event so that Angular learns of input value change. // Dispatch a DOM event so that Angular learns of input value change.
// use newEvent utility function (not provided by Angular) for better browser compatibility // In older browsers, such as IE, you might need a CustomEvent instead. See
nameInput.dispatchEvent(newEvent('input')); // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
nameInput.dispatchEvent(new Event('input'));
// Tell Angular to update the display binding through the title pipe // Tell Angular to update the display binding through the title pipe
fixture.detectChanges(); fixture.detectChanges();

View File

@ -6,7 +6,7 @@ import { DebugElement } from '@angular/core';
import { Router } from '@angular/router'; import { Router } from '@angular/router';
import { addMatchers, newEvent } from '../../testing'; import { addMatchers } from '../../testing';
import { HeroService } from '../model/hero.service'; import { HeroService } from '../model/hero.service';
import { getTestHeroes, TestHeroService } from '../model/testing/test-hero.service'; import { getTestHeroes, TestHeroService } from '../model/testing/test-hero.service';
@ -53,7 +53,10 @@ describe('HeroListComponent', () => {
it('should select hero on click', fakeAsync(() => { it('should select hero on click', fakeAsync(() => {
const expectedHero = HEROES[1]; const expectedHero = HEROES[1];
const li = page.heroRows[1]; const li = page.heroRows[1];
li.dispatchEvent(newEvent('click'));
// In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
li.dispatchEvent(new Event('click'));
tick(); tick();
// `.toEqual` because selectedHero is clone of expectedHero; see FakeHeroService // `.toEqual` because selectedHero is clone of expectedHero; see FakeHeroService
expect(comp.selectedHero).toEqual(expectedHero); expect(comp.selectedHero).toEqual(expectedHero);
@ -62,7 +65,10 @@ describe('HeroListComponent', () => {
it('should navigate to selected hero detail on click', fakeAsync(() => { it('should navigate to selected hero detail on click', fakeAsync(() => {
const expectedHero = HEROES[1]; const expectedHero = HEROES[1];
const li = page.heroRows[1]; const li = page.heroRows[1];
li.dispatchEvent(newEvent('click'));
// In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
li.dispatchEvent(new Event('click'));
tick(); tick();
// should have navigated // should have navigated

View File

@ -3,7 +3,6 @@ import { ComponentFixture, TestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser'; import { By } from '@angular/platform-browser';
import { HighlightDirective } from './highlight.directive'; import { HighlightDirective } from './highlight.directive';
import { newEvent } from '../../testing';
// #docregion test-component // #docregion test-component
@Component({ @Component({
@ -59,9 +58,12 @@ describe('HighlightDirective', () => {
const input = des[2].nativeElement as HTMLInputElement; const input = des[2].nativeElement as HTMLInputElement;
expect(input.style.backgroundColor).toBe('cyan', 'initial backgroundColor'); expect(input.style.backgroundColor).toBe('cyan', 'initial backgroundColor');
// dispatch a DOM event so that Angular responds to the input value change.
input.value = 'green'; input.value = 'green';
input.dispatchEvent(newEvent('input'));
// Dispatch a DOM event so that Angular responds to the input value change.
// In older browsers, such as IE, you might need a CustomEvent instead. See
// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
input.dispatchEvent(new Event('input'));
fixture.detectChanges(); fixture.detectChanges();
expect(input.style.backgroundColor).toBe('green', 'changed backgroundColor'); expect(input.style.backgroundColor).toBe('green', 'changed backgroundColor');

View File

@ -14,18 +14,6 @@ export function advance(f: ComponentFixture<any>): void {
f.detectChanges(); f.detectChanges();
} }
/**
* Create custom DOM event the old fashioned way
*
* https://developer.mozilla.org/en-US/docs/Web/API/Event/initEvent
* Although officially deprecated, some browsers (phantom) don't accept the preferred "new Event(eventName)"
*/
export function newEvent(eventName: string, bubbles = false, cancelable = false) {
const evt = document.createEvent('CustomEvent'); // MUST be 'CustomEvent'
evt.initCustomEvent(eventName, bubbles, cancelable, null);
return evt;
}
// See https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button // See https://developer.mozilla.org/en-US/docs/Web/API/MouseEvent/button
// #docregion click-event // #docregion click-event
/** Button events to pass to `DebugElement.triggerEventHandler` for RouterLink event handler */ /** Button events to pass to `DebugElement.triggerEventHandler` for RouterLink event handler */