Aru*_*n G 9 jasmine typescript karma-jasmine angular angular7-router
我正在尝试使用 jasmine 为 getCurrentNavigation().extras.state 编写单元测试。
为了解决这个问题,我试图监视这个路由器方法。
我的组件文件,
@Component({
selector: 'app-location-list',
templateUrl: './location-list.component.html',
styleUrls: ['./location-list.component.scss']
})
export class LocationListComponent implements OnInit{
locationId;
locationName;
constructor(private activatedRoute: ActivatedRoute, private router: Router) {
if (this.router.getCurrentNavigation().extras.state) {
this.locationId = this.router.getCurrentNavigation().extras.state.locationId;
}
if (this.router.getCurrentNavigation().extras.state) {
this.locationName = this.router.getCurrentNavigation().extras.state.locationName;
}
}
ngOnInit() { }
}
Run Code Online (Sandbox Code Playgroud)
我的规格文件,
describe('LocationListComponent ', () => {
let component: LocationListComponent ;
let fixture: ComponentFixture<LocationListComponent >;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
LocationListComponent
],
providers: []
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LocationListComponent );
component = fixture.componentInstance;
spyOn(Router.prototype, 'getCurrentNavigation').and.returnValues({ 'extras': { 'state': { 'locationId': 100, 'locationName': "UK" } } });
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
但我收到以下错误,
TypeError: Cannot read property 'extras' of null
Run Code Online (Sandbox Code Playgroud)
谁能帮我解决这个问题。我正在使用Angular 7.2
Sha*_*vek 13
您可以使用stub&轻松完成它useClass,spec如果您可以在单独的文件中创建它,它也可以在其他文件中重复使用,然后export class RouterStub尝试:
在spec文件中创建一个stub与以下相同的方法Router:
class RouterStub{
getCurrentNavigation(){
return {
extras: {
state:{
locationId: 'someId',
locationName: 'someName'
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
并在beforeEach()块中:
describe('LocationListComponent ', () => {
let component: LocationListComponent ;
let fixture: ComponentFixture<LocationListComponent >;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
LocationListComponent
],
providers: [ {provide: Router, useClass: RouterStub}]
})
.compileComponents();
}));
beforeEach(() => {
fixture = TestBed.createComponent(LocationListComponent );
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
Bha*_*vin 10
如果我们尝试同时使用两者RouterTestingModule,{provide: Router, useClass: RouterStub}它会抛出错误cannot read property 'root' of undefined
所以我们可以直接为Route创建spy并返回它的值
describe('LocationListComponent', () => {
let component: LocationListComponent ;
let fixture: ComponentFixture<LocationListComponent>;
let router: jasmine.SpyObj<Router>;
beforeEach(async(() => {
TestBed.configureTestingModule({
imports: [
RouterTestingModule
],
declarations: [
LocationListComponent
],
})
.compileComponents();
}));
beforeEach(() => {
router = TestBed.get(Router);
spyOn(router, 'getCurrentNavigation').and.returnValue({ extras: { state: { message: 'msg'} } } as any);
fixture = TestBed.createComponent(LocationListComponent);
component = fixture.componentInstance;
fixture.detectChanges();
});
it('should create', () => {
expect(component).toBeTruthy();
});
});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4737 次 |
| 最近记录: |