【发布时间】:2023-03-29 06:24:01
【问题描述】:
我正在 Angular 2 中测试一个依赖于Router 的服务 (myService)。由于我使用的是 Angular 的组件之一,因此我将使用 Angular 的 TestBed 类。所以我将我的beforeEach 设置如下:
let router: Router;
beforeEach(async(() => {
TestBed.configureTestingModule({
providers: [
{provide: Router, useClass: RouterStub}
]
});
router = TestBed.get(Router);
myService = new MyService(router);
}));
RouterStub 定义为
@Injectable()
export class RouterStub {
navigate() {};
}
现在我写我的测试失败(红色,绿色,重构......)
it('on myServiceMethod calls router', () => {
let spy = spyOn(router, 'navigate');
// myService.myServiceMethod(); // commented out so test fails
expect(spy).toHaveBeenCalledTimes(1);
})
并且测试按预期失败。但是,我现在尝试使用 TestBed Inject 函数编写相同的测试,即
it('on myServiceMethod calls router', () => {
inject([Router], (router: Router) => {
let spy = spyOn(router, 'navigate');
// myService.myServiceMethod(); // commented out so test fails
expect(spy).toHaveBeenCalledTimes(1);
})
})
即使我认为Inject 函数会从TestBed 中检索Router 的相同实例,这个测试也通过了。我不明白什么?
【问题讨论】:
-
你试过
RouterModule.forRoot()在你的TestBed中吗?如果你不调用forRoot(),Router服务将不会被注入。但这只是一个长镜头。 -
@camaron 好主意,但不幸的是没有解决。这似乎很奇怪,只能假设我错过了一些东西。