Тестирование RxJS Subject: метод подписки не вызывается в тесте - PullRequest
0 голосов
/ 01 ноября 2019

У меня есть личный Subject attributeNameSubject . Существует метод setAttributeName , который передает строковое значение субъекту. Мы получаем ссылку на эту тему, используя getAttributeName . Я пытаюсь проверить приведенный выше код, но я всегда получаю ложноположительный результат , то есть тест проходит успешно, но я получаю тест без ожидания предупреждение. Оказывается, это вовсе не вызов метода подписки.

Я тестирую этот код на Angular 7.

private readonly attributeNameSubject = new Subject<string>();

get getAttributeName(): Subject<string> {
  return this.attributeNameSubject;
}

setAttributeName(value: any) {
  this.getAttributeName.next(value.attributeName);
}

it('should set attribute name on valid input', () => {
  service = TestBed.get(AttributeService);

  service.setAttributeName('some random string');
  service.getAttributeName.subscribe((data: string) => {
    expect(data).toEqual('some random string');
  });
});

1 Ответ

2 голосов
/ 01 ноября 2019

С вашим кодом есть две проблемы.

  1. setAttributeName передает значение подписчикам, в то время как getAttributeName слушает наблюдаемое. Поэтому, когда вы вызываете setAttributeName, getAttributeName выдает значение, но на него ничего не подписано. Поэтому вы должны сначала подписаться на getAttributeName, а затем вызвать setAttributeName для выдачи значения.
  2. Ожидание теперь будет выполнено, но тест не пройден, поскольку данные передаются неправильно. getAttributeName испускает value.attributeName, пока вы просто передаете строку. Вместо этого вам нужно передать объект.

Вот рабочий тестовый пример.

it('should set attribute name on valid input', () => {
    service = TestBed.get(AttributeService);

    service.getAttributeName.subscribe((data: string) => {
        expect(data).toEqual('some random string');
    });
    service.setAttributeName({ attributeName: 'some random string' });
});
...