43685


お世話になります。

jasmineでangularのテストを実施しています。今回のケースはngOnInitでwindow.scrollイベントが動いた事を確認するテストなのですが、subscribeだとspyOnが検知してくれず困っています。ご教授ください。テストコードは以下に記載します。

ｔｓ側（失敗する）

[code]

    public ngOnInit() {
        this.route.events.subscribe(event => {
            if (event instanceof NavigationEnd) {
                window.scroll(100, 100);
                alert("ここ呼ばれているはずだよ！！");
            }
        })
    }
    
[/code]

テスト側

[code]

    import { assert } from 'chai';
    import { CounterComponent } from './counter.component';
    import { TestBed, async, ComponentFixture } from '@angular/core/testing';
    import { RouterModule , Router, NavigationEnd ,Routes } from "@angular/router";
    import {APP_BASE_HREF} from '@angular/common';
    let fixture: ComponentFixture<CounterComponent>;
    
    const appRoutes: Routes = [
        {path: 'counter', component: CounterComponent}
      ];
    
    describe('Counter component', () => {
        beforeEach(() => {
            TestBed.configureTestingModule({
                declarations: [CounterComponent],
                imports: [
                    RouterModule.forRoot(appRoutes)
                  ],
                  providers: [{provide: APP_BASE_HREF, useValue : '/' }]
            })
            fixture = TestBed.createComponent(CounterComponent);
            fixture.detectChanges();
        });
    
        it('test', async(() => {
            let router: Router;
            router = TestBed.get(Router); 
            spyOn(window, "scroll");
            router.navigate(["/counter"]);
            fixture.componentInstance.ngOnInit();
            expect(window.scroll).toHaveBeenCalled();
    
        }));
    });
    
[/code]

ｔｓ側（これだと成功します）

[code]

    public ngOnInit() {
        window.scroll(100, 100);
        this.route.events.subscribe(event => {
            if (event instanceof NavigationEnd) {
            }
        })
    }
    
[/code]

subscribe後のalertは検知できているのですが、なぜかspyOnで検知できません。


CC BY-SA 3.0
2018-04-29T07:56:29.617
43650
2018-05-01T04:00:49.873
24385
question
javascript angular4 angular2 jasmine angular5
jasmineでExpected spy scroll to have been called


自己解決しました。subscribeは非同期なのでfakeAsyncを使ってtickで待てばexpectで評価されました。

[code]

    it('test', fakeAsync(() => {
        let router: Router;
        router = TestBed.get(Router); 
        spyOn(window, "scroll");
        router.navigate(["/counter"]);
        fixture.componentInstance.ngOnInit();
        tick(); // or flushMicrotasks()
        expect(window.scroll).toHaveBeenCalled();
    
    }));
    
[/code]


CC BY-SA 3.0
2018-05-01T04:00:49.873
43685
2018-05-01T04:00:49.873
24385
43650
answer