Угловой жасмин шпион не вызывается - PullRequest
0 голосов
/ 16 ноября 2018

Я следую официальному учебнику по Angular, чтобы протестировать компонент, вызывающий асинхронную сервисную функцию: https://angular.io/guide/testing#component-with-async-service

Создание шпиона:

const gardenSpy = jasmine.createSpyObj('GardenService', ['getGardens', 'createGarden']);
gardenSpy.getGardens.and.returnValue(of(testGardens));
...
gardenServiceSpy = TestBed.get(GardenService);

Настройка TestBed для использования моегошпион вместо действительной службы:

TestBed.configureTestingModule({
  declarations: [ MyGardensComponent ],
  providers: [
    { provide: GardenService, useValue: gardenSpy }
  ],
  imports: [FormsModule, HttpClientTestingModule]
})
.compileComponents();

Затем модульный тест, который не проходит:

it('should load the gardens', () => {
  fixture.detectChanges();
  component.getGardens();

  expect(gardenServiceSpy.getGardens.calls.any()).toBe(true, 'getGardens called');
});

Как видно из отчета о покрытии, метод подписки никогда не выполняетсяи утверждение шпиона не выполняется.

отчет о покрытии

В соответствии с руководством по Angular этот метод должен работать и позволять мне возвращать наблюдаемое синхронно.Вызов метода шпиона вручную работает и возвращает правильно, поэтому я предполагаю, что есть проблема с внедрением шпионского сервиса, а не с созданием самого шпиона.Буду признателен за любую помощь!

Если вам нужно просмотреть файлы целиком, я сделал punker здесь (на самом деле не запускается, просто для просмотра файлов)

1 Ответ

0 голосов
/ 16 ноября 2018

Спасибо за предоставление всего вашего кода в Plunker.Я на самом деле переместил его в Stackblitz , чтобы я мог точно видеть то, что вы видите, и смотреть, как он работает.Мне пришлось заглушить службу, но это не имеет значения, так как вы все равно заменяете ее шпионом.

Я заработал, закомментировав строку провайдеров в файле my-gardens.component.ts в разделе @Component:

@Component({
  selector: 'app-my-gardens',
  templateUrl: './my-gardens.component.html',
  styleUrls: ['./my-gardens.component.css'],
  // providers: [GardenService, NgbModal]
})

Это фактически перекрывало шпиона с оригиналомоказание услуг.Была ли причина, по которой вы поместили строку провайдеров, а не в module.ts?

Как вы можете видеть в Stackblitz, тест в настоящее время проходит и вызывается код подписки (проверьте журнал консоли).

...