In Angular version 8, TestBed.get
was deprecated. In Angular version 9, we see why: TestBed.inject<T>
is introduced as a type-safe replacement.
There are two differences between TestBed.get
and TestBed.inject<T>
:
TestBed.get
returnsany
.TestBed.inject<T>
returns a value of typeT
.TestBed.get
accepts a token of typeany
.TestBed.inject<T>
accepts a token of typeType<T> | InjectionToken<T> | AbstractType<T>
.
The type T
in (1) is either a concrete class type, an abstract class type or the value returned by a dependency injection token, as defined by the passed token argument.
(2) is similar to the fact that Injector#get
accepted a token of type any
in Angular version 2. This signature was deprecated in Angular version 4 and a method signature similar to TestBed.inject
was introduced.
This means that in practice, we are able to use for example a string or a number as an injector token. However, this has been a deprecated feature for 3 years and should not be used.
What TestBed.inject
means in practice for our tests is that TypeScript now can infer the type of the returned value when resolving dependencies as seen in Listing 1.
// my.service.spec.ts it('infers dependency types', () => { // `service` has inferred type `MyService` in Angular version 9 const service = TestBed.inject(MyService); });