我如何使用 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));
});
});
原文由 xphong 发布,翻译遵循 CC BY-SA 4.0 许可协议
为了进行测试,我们现在使用
TestBed
创建一个测试模块。我们可以使用TestBed#configureTestingModule
并将元数据对象传递给它,就像我们传递给@NgModule
一样对于路由,我们不使用普通的
RouterModule
,而是使用RouterTestingModule
。这设置了Router
和Location
,所以你不需要自己。您还可以通过调用RouterTestingModule.withRoutes(Routes)
要在测试中获得
Location
和Router
,与您的示例相同。您还可以根据需要注入每个测试
async
上面的用法类似于done
除了我们不需要显式调用done
。在所有异步任务完成后,Angular 实际上会为我们做这件事。获得供应商的另一种方法是从试验台。
这是一个完整的测试,重构你的例子
更新
另外,如果你想简单地模拟路由器,这实际上可能是进行单元测试的更好方法,你可以简单地做
在您的测试中,您要做的就是测试当组件与存根交互时是否使用正确的参数调用存根
除非您真的想测试一些路由,否则这可能是首选方法。无需设置任何路由。在单元测试中,如果您使用的是真实路由,则会涉及不必要的副作用,这些副作用可能会影响您真正尝试测试的内容,这只是组件的行为。而组件的行为就是简单地调用
navigate
方法。它不需要测试路由器是否工作。 Angular 已经保证了这一点。