【问题标题】:Angular2 TestBed InjectAngular2 测试床注入
【发布时间】: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 好主意,但不幸的是没有解决。这似乎很奇怪,只能假设我错过了一些东西。

标签: angular jasmine testbed


【解决方案1】:

你应该使用 @angular/core/testing 中的 getTestBed 并像这样注入它,

  getTestBed().get(YourService)

【讨论】:

  • 但这不是我在第一个通过的测试中所做的吗?是的,这行得通,也是我目前正在使用的,但问题更多是关于理解 inject 函数。
猜你喜欢
  • 2018-03-03
  • 1970-01-01
  • 1970-01-01
  • 2017-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 2017-09-17
相关资源
最近更新 更多