当测试需要Router
的实例时,仅提供Router
本身是不够的:
import {Router} from '@angular/router';
import {it, inject, beforeEachProviders} from '@angular/core/testing';
import {ComponentToTest} from './component.to.test';
describe('ComponentToTest', () => {
beforeEachProviders(() => [
Router,
ComponentToTest
]);
it('should call getData() on contruct', inject([Router], (router) => {
spyOn(ComponentToTest.prototype, 'getData');
expect(ComponentToTest.prototype.getData).not.toHaveBeenCalled();
let component = new ComponentToTest(router);
expect(ComponentToTest.prototype.getData).toHaveBeenCalled();
}));
});
将发生以下错误:
错误:无法解析'Router'的所有参数(?,?,?,?,?,?)。确保所有参数都使用Inject进行修饰或具有有效的类型注释,并且“Router”使用Injectable进行修饰。
但我真的不知道如何解决路由器。
Router
参数在alpha中我们有RootRouter
:
import {RootRouter} from 'angular2/src/router/router';
。现在已经没有任何替代品了。
还没有弄清楚如何提供这些。
似乎这已经在路由器本身提供了
此参数可能仍由SpyLocation
提供:
import {SpyLocation} from '@angular/common/testing';
describe('ComponentToTest', () => {
beforeEachProviders(() => [
provide(Location, { useClass: SpyLocation }),
]);
});
答案 0 :(得分:6)
导入@angular/router/testing
并在ROUTER_FAKE_PROVIDERS
beforeEachProviders()
beforeEachProviders(() => [
ROUTER_FAKE_PROVIDERS,
ComponentToTest
]);
答案 1 :(得分:0)
另一种解决方案是使用import {RouterTestingModule} from '@angular/router/testing';
并将RouterTestingModule
添加到测试文件中的导入中。
beforeEach(() => {
TestBed.configureTestingModule({
declarations: [
AppComponent
],
imports: [
RouterTestingModule
]
});
TestBed.compileComponents();
});