I have a component that uses an EventEmitter and the EventEmitter is used when someone on the page is clicked. Is there any way that I can observe the EventEmitter during a unit test, and use TestComponentBuilder to click the element that triggers the EventEmitter.next() method and see what was sent?
We can take three approaches to testing the behavior of the EventEmitter from the perspective of the parent (the component listening for the event): Invoke the @Output property's emit method (since the EventEmitter is a public property) Dig in to the counter's DebugElement and simulate a click on the button.
The correct syntax in this case would be let methodSpy = spyOn(component1, 'onChange'). and. callThrough(); and after you've triggered the method, expect(methodSpy). toHaveBeenCalled(); .
EventEmitter is used in the directives and components to emit custom events either synchronously or asynchronously. Since EventEmitter class extends RxJS subject class, this means it is observable and can be multicasted to many observers.
SpyOn is a Jasmine feature that allows dynamically intercepting the calls to a function and change its result.
Your test could be:
it('should emit on click', () => { const fixture = TestBed.createComponent(MyComponent); // spy on event emitter const component = fixture.componentInstance; spyOn(component.myEventEmitter, 'emit'); // trigger the click const nativeElement = fixture.nativeElement; const button = nativeElement.querySelector('button'); button.dispatchEvent(new Event('click')); fixture.detectChanges(); expect(component.myEventEmitter.emit).toHaveBeenCalledWith('hello'); });
when your component is:
@Component({ ... }) class MyComponent { @Output myEventEmitter = new EventEmitter<string>(); buttonClick() { this.myEventEmitter.emit('hello'); } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With