Я не могу правильно настроить тест службы Angular с использованием BehaviorSubject для создания объекта состояния - PullRequest
0 голосов
/ 16 января 2020

У меня есть служба, которая выполняет вызов API, а затем устанавливает значения для объекта закрытого состояния, а затем отправляет обновление субъекту поведения.

@Injectable({
  providedIn: 'root'
})
export class ExeService {
  private state: IState = {
    things: {}  
  };

  public things$: BehaviorSubject<{ [key: string]: IThing }> = new BehaviorSubject<{ [key: string]: IThing }>(this.state.things);

  constructor(
    private http: HttpClient
  ) { }

  public getThings() {
    this.http.get('/api/things').subscribe({
      next: (res) => {
        this.state.things = res;
        this.things$.next(this.state.things)
      }
    })
  }
}

Я хочу проверить эти вызовы API и выполнить убедитесь, что они правильно устанавливают значения в состоянии и обновляют тему поведения.

describe('ExeService', () => {
  let injector: TestBed;
  let service: ExeService;
  let httpMock: HttpTestingController;

  beforeEach(() => {
    TestBed.configureTestingModule({
      providers: [
        ExeService
      ],
      imports: [
        HttpClientTestingModule
      ]
    });
    injector = getTestBed();
    service = injector.get(ExeService);
    httpMock = injector.get(HttpTestingController);
  });

  afterEach(() => {
    httpMock.verify();
  });

  it('Should get things', (done) => {

    service.getThings();
    service.things$.subscribe(things => {

      if (Object.keys(things).length) {
        expect(things).toEqual(MockedThings_ApiResponse);
        done();
      }

    });

    const req = httpMock.expectOne(`/api/things`);
    expect(req.request.method).toEqual('GET');
    req.flush(MockedThings_ApiResponse);

  });
});

Когда тест выполняется, он фактически выполняет getThings() и оценивает подписку на субъект поведения до req.flush. Как я концептуально понимаю, все это не должно оцениваться, пока не будут предоставлены все параметры теста. Я получаю запрос 404 на http://localhost:9876/api/things (тестовый порт кармы) и , затем делает тестовый запрос. (Я также получаю тонну 404 предупреждений от файлов SASS, пытающихся получить файлы шрифтов не в каталоге моего приложения, но это уже другая история).

Чтобы оценить, что у меня есть ожидаемые значения, я сначала должен проверить если субъект поведения имеет какие-либо значения, следовательно, Object.keys(things).length. Я думаю, что это фактически делает тест недействительным, потому что, если службе не удалось его установить, expect() никогда не произойдет и, следовательно, будет иметь ложное срабатывание. Однако, если я удаляю это, то тест не пройден из-за первоначального результата подписки, возвращающего {}.

Вопрос: Я не понимаю, как это должно работать, или я настраиваю свою тесты совершенно неверно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...