Комплекс модульных испытаний Наблюдаемые потоки

У меня есть следующая функция, которая (я думаю) возвращает составную наблюдаемую:

test(cell) {
   const observ1 = this.store.select('range').flatMap((val: IRange) => {return this.getCellOEE(val.value)});
   const observ2 = this.getCellOEE(cell);
   return Observable.merge(observ1, observ2);
}

Я использую это в угловой службе 4, и пытаюсь провести модульный тест с жасмином и кармой.

Так что я издеваюсь над магазином вот так:

class mockStore {
  select(): Observable<IRange> {
    return Observable.of({value: 'daily', start: moment(), end: moment()}, {value: 'monthly', start: moment(), end: moment()})
  }
}

и тогда у меня есть следующий тест:

 it('should update result on store change', fakeAsync(inject(
    [MockBackend, OeeService],
    (backend: MockBackend, s: OeeService) => {
      const urls = [];

      backend.connections.subscribe((connection: MockConnection) => {
        const req: any = connection.request;
        urls.push(req.url);
        if (req.method === RequestMethod.Get && req.url === 'api/getLine/data' req.headers.get('range') === 'daily') {
          connection.mockRespond(new Response(new ResponseOptions({ body: { data: 12 } })));
        }
        if (req.method === RequestMethod.Get && req.url === 'api/getLine/data' &&
          req.headers.get('range') === 'monthly') {
          connection.mockRespond(new Response(new ResponseOptions({ body: { data: 15 } })));
        }
      });
      let value;
      s.test('powders').subscribe(val => {
        value = val;
      })

      tick();
      expect(value).toEqual(12);
      tick();
      expect(value).toEqual(15);
    })
  ));

Я надеюсь, что ясно, чего я пытаюсь достичь, поэтому, когда test() Изначально вызывается функция, выполняется прямой http-вызов, но затем мое поддельное хранилище должно выпустить изменение параметров, сопоставить это с запросом http с новыми параметрами, а затем вернуть другое значение.

Я в настоящее время получаю первый expect() мимоходом, но второй провал с:

Ожидается, что 12 будет содержать 15

Так что я думаю, что есть проблема времени? Любые идеи, как я могу решить это? Я думаю, что проверка важна для проверки, потому что тогда я могу подать в суд на старый добрый TDD, чтобы доказать, работает ли этот подход.

Обновить:

Вот мой полный файл модульного теста

1 ответ

Решение

Вы правы, во время теста возникла проблема со временем. Ко времени первого Expect() Выражение происходит, оба издеваются Responses вернулись. Чтобы исправить свой тест, вы можете изменить один из ответов, чтобы использовать setTimeout() и установить tick() между пунктами ожидания до некоторого времени после этой задержки.

например:

if (req.method === RequestMethod.Get && req.url === 'api/getLine/data' && req.headers.get('range') === 'monthly') {
    setTimeout(() => { 
        connection.mockRespond(new Response(new ResponseOptions({ body: { data: 15 } })));      }, 100);
}

а также:

expect(value).toEqual(12);
tick(100);
expect(value).toEqual(15);

Однако, аналогично тому, что сказала Джулия выше, лучшим тестом было бы поместить значения в массив и проверить правильность значений в соответствующих индексах. В этом случае я бы рекомендовал заменить flatMap() в вашей тестовой функции с concatMap(), который сохраняет порядок. Затем вы можете написать несколько тестов с задержкой каждого ответа и при этом проверить правильность значений в соответствующих индексах:

tick(100);
expect(values[0]).toEqual(12);
expect(values[1]).toEqual(15);
Другие вопросы по тегам