Angular 9 TestBed.inject和提供者覆盖

11

在使用提供程序重写时,由于Angular 9中TestBed.get已被弃用,以下内容现在有哪些替代方案?

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

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

是这样吗?还是有更好的方法?

const obj : MyStub = TestBed.inject(MyClass) as unknown as MyStub;
2个回答

11

从实际意义上讲,您的 MyStub 应该至少是一个 Partial 或者继承被尝试模拟的类的类,否则你的测试就有点“错”了,所以如果是这种情况,您可以这样做:

const obj = TestBed.inject(MyClass);

如果您的存根具有不同的属性或不同的函数签名,则可以进行如下操作:

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

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


3
谢谢,我的存根将实现与它们所代表的类相同的接口,但会包含一些辅助方法,以使单元测试更加顺畅。这就是需要进行类型转换以公开这些额外功能的原因。 - C. Rodwell
@C.Rodwell 好的,我明白了。您也可以考虑从测试工具中导出这些函数,但我想这取决于函数的特性:) - Poul Kruijt

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接