我正在为以下代码块编写测试用例:
someFn() {
if (this.loginStatus === '1') {
this.router.navigate(['/login']);
}
}
在我的规范文件中:
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编写的,我使用的是jasmine+karma。
尝试以下方式:
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']);
});
})