【问题标题】:Angular 9 TestBed.inject & Provider OverridesAngular 9 TestBed.inject 和提供者覆盖
【发布时间】:2020-06-02 11:34:06
【问题描述】:

既然 TestBed.get 在 Angular 9 中已被弃用,那么当使用提供者覆盖时,以下替代方案是什么

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

const obj : MyStub = TestBed.get(MyClass);

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

const obj : MyStub = TestBed.inject(MyClass) as unknown as MyStub;

【问题讨论】:

    标签: angular angular-test angular9 angular-unit-test


    【解决方案1】:

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

    const obj = TestBed.inject(MyClass);
    

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

    const obj = TestBed.inject<MyStub>(MyClass as any);
    

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

    【讨论】:

    • 谢谢,我的存根将实现与它们作为存根的类相同的接口,但会有额外的功能,例如帮助方法,以使单元测试更顺畅。这就是演员表暴露这些额外内容的地方。
    • @C.Rodwell 好的,我明白了。您也可以考虑从测试实用程序中导出这些功能,但我想这取决于功能:)
    【解决方案2】:
    let valueServiceSpy: jasmine.SpyObj<ValueService>;
    
    beforeEach(() => {
      const spy = jasmine.createSpyObj('ValueService', ['getValue']);
    
      TestBed.configureTestingModule({
        providers: [
          { provide: ValueService, useValue: spy }
        ]
      });
      // This is new way to inject Spied Service
      valueServiceSpy = TestBed.inject(ValueService) as jasmine.SpyObj<ValueService>; 
    });
    

    然后在测试中

    it('#getValue should return stubbed value from a spy', () => {
      valueServiceSpy.getValue.and.returnValue(yourValue);
      ...
    });
    

    Ref

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-04
      • 2023-03-10
      • 2014-07-10
      • 1970-01-01
      相关资源
      最近更新 更多