Настройка ngrx/data для интеграционного тестирования

Я пытаюсь настроить интеграционный тест, который будет получать некоторые данные из серверной службы API с использованием сущностей ngrx/data.

У меня есть этот StackBlitz: https://stackblitz.com/edit/ngrxdata-testing-not-working-pxfmkb?file=src/main.ts

Он должен запускать тесты при запуске - в моих тестовых примерах нет никаких ожиданий, однако я просматриваю журналы консоли и ожидаю, что он покажет журнал ClientDataService (/src/app/data/client/client-data.service.ts), то есть:

console.log('never goes here :(');

В интеграционном тесте (data.integration.spec.ts) я настраиваю модуль, определяя тип объекта Client и включая AppDataServiceModule что, в свою очередь, делает это:

import { NgModule } from '@angular/core';
import { ClientDataService } from './client/client-data.service';
import { EntityDataService, EntityDefinitionService } from '@ngrx/data';

@NgModule({
  providers: [
    ClientDataService,
  ],
})
export class AppDataServiceModule {
  constructor(
    entityDataService: EntityDataService,
    clientDataService: ClientDataService
  ) {
    entityDataService.registerService('Client', clientDataService);
  }
}

Как видите, я регистрирую службу данных, как это предлагается в документации ngrx, здесь

Я чувствую себя довольно близко, но мне просто нужно толкнуть в правильном направлении, чтобы все заработало!

1 ответ

Пользовательский DataService должен расширять DefaultDataService. Должно выглядеть примерно так:

export class ClientDataService extends DefaultDataService<Client> {

  constructor(
    http: HttpClient, httpUrlGenerator: HttpUrlGenerator
  ) {
    super('Client', http, httpUrlGenerator);
  }

  public getAll(): Observable<any> {
    // get Data here
  }
}

В BackendService должен вернуть Observable:

public getClients(): Observable<Array<Client>> {
  // will be mocked
  return of([
    {
      id: '1: Will not return as it will be mocked'
    },
    {
      id: '2: Will not return as it will be mocked'
    }
  ])
}

Есть еще две вещи, которые мне кажутся подозрительными:

  1. В коде нет подписки, поэтому я предполагаю, что ваш Observable холодно.
  2. В clientResolve.resolve({}, {}) звонок ожидает ActivatedRouteSnapshotкак первый параметр. Я не так хорошо знаком сResolve интерфейс, но, возможно, это тоже проблема.
Другие вопросы по тегам