javascript – Angular 2最终版本路由器单元测试
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了javascript – Angular 2最终版本路由器单元测试,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4152字,纯文字阅读大概需要6分钟。
内容图文
如何使用karma和jasmine对Angular 2.0.0版中的路由器进行单元测试?
这是我的旧单元测试在版本2.0.0-beta.14中的样子
import {
it,
inject,
injectAsync,
beforeEach,
beforeEachProviders,
TestComponentBuilder
} from 'angular2/testing';
import { RootRouter } from 'angular2/src/router/router';
import { Location, RouteParams, Router, RouteRegistry, ROUTER_PRIMARY_COMPONENT } from 'angular2/router';
import { SpyLocation } from 'angular2/src/mock/location_mock';
import { provide } from 'angular2/core';
import { App } from './app';
describe('Router', () => {
let location, router;
beforeEachProviders(() => [
RouteRegistry,
provide(Location, {useClass: SpyLocation}),
provide(Router, {useClass: RootRouter}),
provide(ROUTER_PRIMARY_COMPONENT, {useValue: App})
]);
beforeEach(inject([Router, Location], (_router, _location) => {
router = _router;
location = _location;
}));
it('Should be able to navigate to Home', done => {
router.navigate(['Home']).then(() => {
expect(location.path()).toBe('');
done();
}).catch(e => done.fail(e));
});
});
解决方法:
为了测试,我们现在使用TestBed创建一个测试模块.我们可以使用TestBed#configureTestingModule并将元数据对象传递给它,就像我们传递给@NgModule一样
beforeEach(() => {
TestBed.configureTestingModule({
imports: [ /* modules to import */ ],
providers: [ /* add providers */ ],
declarations: [ /* components, directives, and pipes */ ]
});
});
对于路由,我们不使用普通的RouterModule,而是使用RouterTestingModule.这将设置路由器和位置,因此您不需要自己.您也可以通过调用RouterTestingModule.withRoutes(路由)将路由传递给它
TestBed.configureTestingModule({
imports: [
RouterTestingModule.withRoutes([
{ path: 'home', component: DummyComponent }
])
]
})
要在测试中获取位置和路由器,同样的方法可行,如您的示例所示.
let router, location;
beforeEach(() => {
TestBed...
});
beforeEach(inject([Router, Location], (_router: Router, _location: Location) => {
router = _router;
location = _location;
}));
您也可以根据需要注入每个测试
it('should go home',
async(inject([Router, Location], (router: Router, location: Location) => {
})));
除了我们不需要显式调用done之外,上面的异步使用就像完成一样.在所有异步任务完成后,Angular实际上会为我们做这件事.
获得提供者的另一种方法是从试验台.
let location, router;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule.withRoutes([
{ path: 'home', component: DummyComponent }
])],
});
let injector = getTestBed();
location = injector.get(Location);
router = injector.get(Router);
});
这是一个完整的测试,重构你的例子
import { Component } from '@angular/core';
import { Location } from '@angular/common';
import { Router } from '@angular/router';
import { RouterTestingModule } from '@angular/router/testing';
import { fakeAsync, async, inject, TestBed, getTestBed } from '@angular/core/testing';
import { By } from '@angular/platform-browser';
@Component({
template: `
<router-outlet></router-outlet>
`
})
class RoutingComponent { }
@Component({
template: ''
})
class DummyComponent { }
describe('component: RoutingComponent', () => {
let location, router;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [RouterTestingModule.withRoutes([
{ path: 'home', component: DummyComponent }
])],
declarations: [RoutingComponent, DummyComponent]
});
});
beforeEach(inject([Router, Location], (_router: Router, _location: Location) => {
location = _location;
router = _router;
}));
it('should go home', async(() => {
let fixture = TestBed.createComponent(RoutingComponent);
fixture.detectChanges();
router.navigate(['/home']).then(() => {
expect(location.path()).toBe('/home');
console.log('after expect');
});
}));
});
UPDATE
此外,如果你想简单地模拟路由器,这实际上可能是进行单元测试的更好方法,你可以简单地做
let routerStub;
beforeEach(() => {
routerStub = {
navigate: jasmine.createSpy('navigate'),
};
TestBed.configureTestingModule({
providers: [ { provide: Router, useValue: routerStub } ],
});
});
在测试中,您要做的就是测试在组件与之交互时使用正确的参数调用存根
expect(routerStub.navigate).toHaveBeenCalledWith(['/route']);
除非你真的想测试一些路由,否则这可能是首选的方法.无需设置任何路由.在单元测试中,如果您使用实际路由,则会涉及不必要的副作用,这可能会影响您实际尝试测试的内容,这只是组件的行为.组件的行为是简单地调用导航方法.它不需要测试路由器的工作原理. Angular已经保证了这一点.
内容总结
以上是互联网集市为您收集整理的javascript – Angular 2最终版本路由器单元测试全部内容,希望文章能够帮你解决javascript – Angular 2最终版本路由器单元测试所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。