簡體   English   中英

Angular 9 TestBed.inject 和提供者覆蓋

[英]Angular 9 TestBed.inject & Provider Overrides

由於 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;

出於所有意圖和目的,你的MyStub至少應該是一個 Partial 或一個擴展它試圖模擬的類的類,否則你的測試有點“錯誤”,所以如果是這種情況,你可以這樣做:

const obj = TestBed.inject(MyClass);

如果您的存根上不知何故會有不同的屬性或不同的函數簽名,您也可以這樣做:

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

但一般來說,你的模擬應該(部分)與它模擬的東西共享相同的簽名,這也意味着不需要強制轉換

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);
  ...
});

參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM