Angular 9 TestBed.inject 和提供者覆盖

C. *_*ell 10 angular angular-unit-test angular-test angular9

由于 TestBed.get 在 Angular 9 中已被弃用,因此当使用提供程序覆盖时,以下替代方案是什么

TestBed.configureTestingModule({
  providers: [{ provide: MyClass, useClass: MyStub}]
});

const obj : MyStub = TestBed.get(MyClass);
Run Code Online (Sandbox Code Playgroud)

真的是这样还​​是有更好的方法?

const obj : MyStub = TestBed.inject(MyClass) as unknown as MyStub;
Run Code Online (Sandbox Code Playgroud)

Pie*_*Duc 10

出于所有意图和目的,你MyStub至少应该是一个 Partial 或一个扩展它试图模拟的类的类,否则你的测试有点“错误”,所以如果是这种情况,你可以这样做:

const obj = TestBed.inject(MyClass);
Run Code Online (Sandbox Code Playgroud)

如果您的存根上不知何故会有不同的属性或不同的函数签名,您也可以这样做:

const obj = TestBed.inject<MyStub>(MyClass as any);
Run Code Online (Sandbox Code Playgroud)

但一般来说,你的模拟应该(部分)与它模拟的东西共享相同的签名,这也意味着不需要强制转换

  • 谢谢,我的存根将实现与它们作为存根的类相同的接口,但将具有额外的功能,例如帮助器方法,以使单元测试更加顺利。这就是演员阵容曝光这些额外内容的地方。 (3认同)