TestBed.get 和 new Service(...dependencies) 有什么区别

Jus*_*lan 8 testing jasmine typescript angular

角度导向演示通过调用新服务(),并且直接提供所述依赖于构造的测试,一个的两种不同的方式,并通过调用TestBed.get(服务)使用依赖注入的第二个。

这两个对我来说在功能上似乎相同,除非我连续调用 TestBed.get() 时它不会在第一次调用后调用构造函数。

角文件还提到,TestBed.get()已过时(尽管仍然指南参考吧!),我应该使用类型InjectionToken代替,但我看不出这些类的任何可取代TestBed.get() .

obs*_*eam 7

当您调用 时TestBed.configureTestingModule({ providers: [SomeService] });,这会设置一个可用于后续测试的 NgModule。如果您调用TestBed.get(SomeService),它会SomeService从注入器中检索并在需要时实例化它。如果它被实例化,则注入器注入对其依赖项的引用并返回该服务的新实例。

如果SomeService已经实例化,就像你的情况一样,那么 TestBed 不需要创建它。这意味着它不会在后续时间调用构造函数。

要回答有关差异的问题,如果您正在模拟所有依赖项并且不需要访问 DOM,则它们基本上是相同的。在没有 TestBed 的情况下实例化类要快得多,因为没有为每个测试加载依赖注入器的开销。

至于已弃用的 TestBed.get(),在 Angular 8.0.0 中,仅弃用了允许任何类型的特定重载(请参阅https://github.com/angular/angular/blob/master/packages/core/testing /src/test_bed.ts#L67)。而不是get(token: any, notFoundValue?: any): any;将签名更改为get<T>(token: Type<T> | InjectionToken<T>, notFoundValue?: T, flags?: InjectFlags): any;这意味着您必须使用类引用或注入令牌。没有字符串或其他东西来引用注入器中的某些东西。

在 Angular 9.0.0 中, TestBed.get() 方法将被完全弃用,您需要使用它TestBed.inject来代替。见https://github.com/angular/angular/blob/master/packages/core/testing/src/test_bed.ts#L65


Ali*_*avi 5

从 v9.0.0 弃用,使用 TestBed.inject

get(token: any, notFoundValue?: any): any
Run Code Online (Sandbox Code Playgroud)

看看我们现在如何注入:

describe('MyAmountComponent', () => {
  let component: MyAmountComponent;
  let fixture: ComponentFixture<MyAmountComponent>;
  let productService: ProductService;
  let orderService: OrderService;
  beforeEach(() => {
    TestBed.configureTestingModule({
       .....
    })
    .compileComponents();
    productService = TestBed.inject(ProductService);
    orderService = TestBed.inject(OrderService);
  });
Run Code Online (Sandbox Code Playgroud)

只是添加所以可能可以帮助某人。


Bha*_*vin 5

get 已弃用:从 v9.0.0 开始使用 TestBed.inject (弃用)

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>; 
});
Run Code Online (Sandbox Code Playgroud)

然后在测试中

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

官方文档: https: //v9.angular.io/guide/testing#angular-testbed