Search code examples
angularasynchronousangular-event-emitter

Angular: how to force EventEmitter to flush in test


I have following Angular test:

it('should pass', fakeAsync(() => {
      let a;
      const eventEmitter1 = of('A');
      eventEmitter1.subscribe(v => a = v);

      let b;
      const eventEmitter2 = new EventEmitter();
      eventEmitter2.emit('B');
      eventEmitter2.subscribe(v => b = v);

      tick();
      flush();

      console.log(a); // Outputs A
      console.log(b); // outputs undefined

      expect(a).toBe('A');
      expect(b).toBe('B'); // How to make the test to pass here?
    }));

I am not able to flush the eventEmitter2 and test fails. How can I flush the EventEmmiter.emit() in a test?

Note: This is simplified version of my test that uses async pipe from Angular that uses EventEmitter internally.

"@angular/core": "^8.2.14"

enter image description here


Solution

  • Place eventEmitter2.emit('B'); after eventEmitter2.subscribe(v => b = v);

    eventEmitter2.subscribe(v => b = v);
    eventEmitter2.emit('B');
    

    As EventEmitter is an extension to the Subject. It won't publish previous events to new subscribers.