diff --git a/aio/content/examples/testing/src/app/hero/hero-detail.component.spec.ts b/aio/content/examples/testing/src/app/hero/hero-detail.component.spec.ts index 2326e3dded..2989c6e05a 100644 --- a/aio/content/examples/testing/src/app/hero/hero-detail.component.spec.ts +++ b/aio/content/examples/testing/src/app/hero/hero-detail.component.spec.ts @@ -197,20 +197,21 @@ function heroModuleSetup() { // #docregion title-case-pipe it('should convert hero name to Title Case', () => { - const inputName = 'quick BROWN fox'; - const titleCaseName = 'Quick Brown Fox'; - const { nameInput, nameDisplay } = page; + // get the name's input and display elements from the DOM + const hostElement = fixture.nativeElement; + const nameInput: HTMLInputElement = hostElement.querySelector('input'); + const nameDisplay: HTMLElement = hostElement.querySelector('span'); - // simulate user entering new name into the input box - nameInput.value = inputName; + // simulate user entering a new name into the input box + nameInput.value = 'quick BROWN fOx'; // dispatch a DOM event so that Angular learns of input value change. nameInput.dispatchEvent(newEvent('input')); - // Tell Angular to update the output span through the title pipe + // Tell Angular to update the display binding through the title pipe fixture.detectChanges(); - expect(nameDisplay.textContent).toBe(titleCaseName); + expect(nameDisplay.textContent).toBe('Quick Brown Fox'); }); // #enddocregion title-case-pipe // #enddocregion selected-tests diff --git a/aio/content/guide/testing.md b/aio/content/guide/testing.md index 22894476e2..d47c2d457a 100644 --- a/aio/content/guide/testing.md +++ b/aio/content/guide/testing.md @@ -785,6 +785,25 @@ There is no harm in calling `detectChanges()` more often than is strictly necess
+{@a dispatch-event} + +#### Change an input value with _dispatchEvent()_ + +To simulate user input, you can find the input element and set its `value` property. + +You will call `fixture.detectChanges()` to trigger Angular's change detection. +But there is an essential, intermediate step. + +Angular doesn't know that you set the input element's `value` property. +It won't read that property until you raise the element's `input` event by calling `dispatchEvent()`. +_Then_ you call `detectChanges()`. + +The following example demonstrates the proper sequence. + + + +
+ ### Component with external files The `BannerComponent` above is defined with an _inline template_ and _inline css_, specified in the `@Component.template` and `@Component.styles` properties respectively.