Leo*_*ler 9 jasmine typescript angular
我正在尝试使用RC1与"新的"路由器一起工作的单元测试.我怎样才能做到这一点3.0.0-alpha.8
?
我的依赖:
"@angular/common": "2.0.0-rc.3",
"@angular/compiler": "2.0.0-rc.3",
"@angular/core": "2.0.0-rc.3",
"@angular/forms": "0.2.0",
"@angular/platform-browser": "2.0.0-rc.3",
"@angular/platform-browser-dynamic": "2.0.0-rc.3",
"@angular/router": "3.0.0-beta.2",
Run Code Online (Sandbox Code Playgroud)
我想要测试的组件使用该routerLink
指令:
import {ROUTER_DIRECTIVES} from '@angular/router';
@Component({
selector: 'app-topmenu',
template: require('./app-topmenu.tpl.html'),
directives: [ROUTER_DIRECTIVES]
})
export class TopMenu {
Run Code Online (Sandbox Code Playgroud)
<nav class="app-top-menu">
<a *ngFor="let link of links" [routerLink]="link.route">{{link.text}}</a>
</nav>
Run Code Online (Sandbox Code Playgroud)
以前,使用rc1,我使用类似的东西对我的组件进行单元测试:
import {Location} from '@angular/common';
import {SpyLocation} from '@angular/common/testing';
import {Router, RouteRegistry, ROUTER_DIRECTIVES, ROUTER_PRIMARY_COMPONENT} from '@angular/router-deprecated';
import {RootRouter} from '@angular/router-deprecated/src/router';
describe('Router link capabilities', () => {
beforeEachProviders(() => [
RouteRegistry,
{ provide: Location, useClass: SpyLocation },
{ provide: ROUTER_PRIMARY_COMPONENT, useValue: TestComponent },
{ provide: Router, useClass: RootRouter }
]);
it('creates routerLinks with the expected URLs', fakeAsync(
inject([TestComponentBuilder, Location], (tcb: TestComponentBuilder, spyLocation: SpyLocation) => {
tcb.overrideTemplate(TestComponent, `
<app-top-menu [links]='[
{ text: "A", route: ["/TestA/TestB/TestC"] },
{ text: "B", route: ["/TestA", "TestB", "TestC"] }
]'></app-top-menu>
<router-outlet></router-outlet>
`).createAsync(TestComponent)
.then((fixture: ComponentFixture<TestComponent>) => {
fixture.detectChanges();
spyLocation.simulateUrlPop('url-a/url-b/url-c');
tick();
fixture.detectChanges();
let nativeLinks: HTMLAnchorElement[] = fixture.nativeElement.querySelectorAll('a');
expect(nativeLinks.length).toBe(2);
expect(nativeLinks[0].textContent).toBe('A');
expect(nativeLinks[1].textContent).toBe('B');
});
})
));
});
Run Code Online (Sandbox Code Playgroud)
当我尝试只是将routerLink
导入切换@angular/router-deprecated
为导入ROUTER_DIRECTIVES
时@angular/router
,我收到一个错误:
ORIGINAL EXCEPTION: Platforms have to be created via `createPlatform`!
Run Code Online (Sandbox Code Playgroud)
我可以在网上找到关于测试"新的新"路由器和createPlatform消息的所有文档,指的是提供ROUTER_FAKE_PROVIDERS
哪些似乎包含在rc2中,但是与rc3一起使用:
import {ROUTER_FAKE_PROVIDERS} from '@angular/router/testing';
// ^ [ts] Cannot find module '@angular/router/testing'.
Run Code Online (Sandbox Code Playgroud)
搜索.d.ts
文件node_modules/@angular/router
夹中的编译文件,我也没有找到任何测试/模拟/假货的参考.
有没有人迁移到rc3并使其正常工作?
要测试 RC3 (3.0.0-alpha.*) 路由器,您需要执行一些与以前版本中路由器设置方式不同的操作。
你需要RouterConfig
像这样定义一个:
import {provideRouter, RouterConfig} from '@angular/router';
export const APP_ROUTES : RouterConfig = [
{path: '', component: AppComponent},
// more paths
];
export const APP_ROUTE_PROVIDERS = [
provideRouter(APP_ROUTES)
];
Run Code Online (Sandbox Code Playgroud)
然后在你的测试文件中
import {ActivatedRoute, RouterConfig, Router} from '@angular/router';
class MockRouter { createUrlTree() {} }
class MockActivatedRoute { }
beforeEachProviders(() => [
provide(Router, { useClass: MockRouter }),
provide(ActivatedRoute, { useClass: MockActivatedRoute }),
]);
describe(){
// etc
}
Run Code Online (Sandbox Code Playgroud)
您的路由器现在可以测试了。
对于 RC4:
import {ActivatedRoute, RouterConfig, Router} from '@angular/router';
class MockRouter { createUrlTree() {} }
class MockActivatedRoute { }
describe(){
beforeEach(() => [
addProviders([
provide(Router, { useClass: MockRouter }),
provide(ActivatedRoute, { useClass: MockActivatedRoute }),
]);
]);
//etc
}
Run Code Online (Sandbox Code Playgroud)