Ожидаемый шпионский переход был вызван с помощью [['/ login']], но он так и не был вызван - PullRequest
0 голосов
/ 05 мая 2020

Я пишу тестовый пример для блока кода ниже:

someFn() {
    if (this.loginStatus === '1') {
      this.router.navigate(['/login']);
    } 
}

В моем файле spe c:

import { Router } from '@angular/router'
describe('MyComponent', () => {
 let routerStub;
 beforeEach(async(() => { 
   routerStub = {
      navigate: jasmine.createSpy('navigate'),
    };
   TestBed.configureTestingModule({
     declarations: [MyComponent],
     providers: [       
        { provide: Router, useValue: routerStub },
      ],
   }).compileComponents()
 });

 beforeEach(() => {
    fixture = TestBed.createComponent(MyComponent);
    component = fixture.componentInstance;
    fixture.autoDetectChanges();
  });

  it('navigate to login', () => {
     component.loginStatus = '1';
     component.someFn();
     expect(routerStub.navigate).toHaveBeenCalledWith(['/login']);
  });
})

Вышеупомянутое дает мне ошибку: Ожидается, что шпионская навигация была вызвана с помощью [['/ login']], но она так и не была вызвана.

Как мне решить эту проблему? Я пробовал много решений от SO, но, похоже, у меня ничего не работает.

Код написан на Angular 7, и я использую жасмин + карма.

1 Ответ

0 голосов
/ 06 мая 2020

Попробуйте следующим способом:

import { Router } from '@angular/router'
    describe('MyComponent', () => {
     let router: Router;
     beforeEach(async(() => { 
       TestBed.configureTestingModule({
         declarations: [MyComponent],
         providers: [       
            { provide: Router, useValue: routerStub },
          ],
       }).compileComponents()
     });

     beforeEach(() => {
        fixture = TestBed.createComponent(MyComponent);
        component = fixture.componentInstance;
        router = TestBed.get(Router);
        fixture.detectChanges();
      });

      it('navigate to login', () => {
      const spy = spyOn(router, 'navigate');
         component.loginStatus = '1';
         component.someFn();
         expect(router.navigate).toHaveBeenCalledWith(['/login']);
      });
    })

Другой способ с помощью routerStub: -

       import { Router } from '@angular/router';
 
       class RouterStub {
          public navigate(params: any[]): void {}
        }
 
        describe('MyComponent', () => {
         let router: Router;
         beforeEach(async(() => { 
           TestBed.configureTestingModule({
             declarations: [MyComponent],
             providers: [       
                { provide: Router, useClass: RouterStub },
              ],
           }).compileComponents()
         });
        
         beforeEach(() => {
            fixture = TestBed.createComponent(MyComponent);
            component = fixture.componentInstance;
            router = TestBed.get(Router);
            fixture.detectChanges();
          });
        
          it('navigate to login', () => {
          const spy = spyOn(router, 'navigate');
             component.loginStatus = '1';
             component.someFn();
             expect(router.navigate).toHaveBeenCalledWith(['/login']);
          });
        })
...