То, что вы пытаетесь сделать, не работает.Инъекция зависимостей и наследование классов напрямую не связаны.Это означает, что вы не можете переключить базовый класс своего сервиса следующим образом.
На мой взгляд, у вас есть два способа сделать это.
Вариант 1:
Вместо насмешки над BaseApi и предоставления имитации в вашем тесте, вам нужно смоделировать EntityApi и предоставить этот макет в своем тесте.
Вариант 2:
Вместо того чтобы позволить EntityApi расширяться от BaseApi, вы можете оставить BaseApi простым сервисом и предоставить его в качестве зависимости.
Вместо
class EntityApi extends BaseApi {
constructor(private injector: Injector) {
вы делаете
class EntityApi {
constructor(private api: BaseApi) {
Если вы настраиваете свой EntityApi таким образом, он не расширяется от BaseApi, а скорее имеет зависимость,Затем вы можете создать макет BaseApi и предоставить его, как вы сделали в своем тесте.
Редактировать
Относительно вашего комментария:
Поскольку я должен использовать методы из BaseApi, я не могу обходиться без расширений.
Это не правда.Допустим, у BaseApi есть метод foo (), который вы хотите использовать.Когда вы расширяете свой базовый класс, использование может выглядеть следующим образом:
class EntityApi extends BaseApi {
constructor(private injector: Injector) {}
exampleMethod() {
this.foo();
}
}
Если у вас есть зависимость, вы все равно можете вызвать метод следующим образом:
class EntityApi {
constructor(private api: BaseApi) {}
exampleMethod() {
this.api.foo();
}
}
Вы не делаетенеобходимо расширить из BaseApi для вызова методов на нем.