При написании модульных тестов вы хотели бы смоделировать каждую вашу зависимость.Вы уже делаете это для HttpClient
, импортируя HttpClientTestingModule
, поэтому вам нужно сделать то же самое для ConfigService
.
. Есть два способа сделать это.
1- Фальшивая служба (заглушка)
export class ConfigServiceStub {
get(input: string) {
// return static value instead of calling an API
}
}
...
beforeEach(() => {
TestBed.configureTestingModule({
imports: [
HttpClientTestingModule
],
providers: [DataService,
{provide: ConfigService, useClass: ConfigServiceStub}
]
});
mock = TestBed.get(HttpTestingController);
service = TestBed.get(DataService);
});
Таким образом, ваш DataService
не будет вызывать реальный ConfigService
, а вместо этого 'вызовем get
метод ConfigServiceStub
.При использовании Stub
s вам не нужно беспокоиться о других зависимостях ConfigService
.Вы просто реализуете методы, которые хотите переопределить.
2-шпионы
Вы можете создать шпионов для метода, который вы не хотите вызывать.
it('run some test', inject([DataService], (service: DataService) => {
spyOn(service.config, 'get').and.returnValue('someString');
// run your tests here
});
Несмотря на то, что метод ConfigService.get
не будет вызываться в приведенном выше примере, Angular по-прежнему необходимо создать экземпляр ConfigService
, что может быть трудно сделать в некоторых примерах или может привести к созданиюслишком много других сервисов для простого теста.
Я бы выбрал вариант 1
Для получения дополнительной информации о шпионах, отметьте здесь