Testing the function triggered by the "(window:resize)" event in Angular 2

11,332

I had the same problem and I solved it using a Spy on the function triggered by the resize event. Thus, you could do something like this:

  it('should trigger onResize method when window is resized', () => {
    const spyOnResize = spyOn(component, 'onResize');
    window.dispatchEvent(new Event('resize'));
    expect(spyOnResize).toHaveBeenCalled();
  });

This would be a clearer as you wouldn't need to establish local variables to detect if it was triggered. ;)

Share:
11,332

Related videos on Youtube

ed-tester
Author by

ed-tester

Updated on November 28, 2020

Comments

  • ed-tester
    ed-tester over 3 years

    I am attempting to test a function (with Karma) that is triggered by a window resize event. Everything works normally in the real world, but when I try to manually trigger the event in the test the function never gets called. This is resulting in a failed test.

    Here is my HTML:

    <div id="topnav" 
         class="navbar navbar-graylight header-width" 
         role="banner" 
         (window:resize)="onResize($event)"></div>
    

    Here is my onResize() Function:

    @Component({
      selector: "main-header",
      templateUrl: "main-header.component.html",
    })
    export class MainHeaderComponent {
    
      public itWasTriggered = false;
    
      public onResize(event) {
        this.itWasTriggered = true;
      }
    }
    

    Here is my Test:

    it("Why is onResize() not being ran", () => { 
       const heroEl = fixture.debugElement.query(By.css(".navbar-graylight"));
       heroEl.triggerEventHandler("window:resize", null); 
       expect(comp.itWasTriggered).toBe(true);
    });
    

    This is what shows up in the inspector:

    <div _ngcontent-a-1="" class="navbar navbar-graylight header-width" id="topnav" role="banner">
      <!--template bindings={}-->
      <!--template bindings={}-->
    </div>
    
    • Winter Soldier
      Winter Soldier over 7 years
      could you confirm if the div "topnav" is visible in the body? Has your fixture added it onto your page?
    • ed-tester
      ed-tester over 7 years
      @WinterSoldier: Thanks, I now have added what shows up in the inspector above.
    • Winter Soldier
      Winter Soldier over 7 years
      Now could you try replacing the heroEl.triggerEventhandler() with window.dispatchEvent(new Event('resize')); as mentioned here
    • dibbledeedoo
      dibbledeedoo about 7 years
      I have my resize event handling set up somewhat differently (Observable.fromEvent(window, 'resize')...) but was having the same testing issue. I can confirm that @WinterSoldier's suggestion of window.dispatchEvent(new Event('resize')); did resolve the testing issue for me. Thanks!!
    • oooyaya
      oooyaya about 7 years
      How about testing it, given a specific height or width? window.resizeTo doesn't seem to invoke the handler and you can't set innerWidth on the readonly currentTarget.