Своеобразный результат из наблюдаемого: тестирование с использованием жасминового мрамора - PullRequest
2 голосов
/ 12 февраля 2020

У меня есть небольшая функция в Angular 7, которую я тестирую с помощью Jest. Функция выглядит следующим образом:

private checkFreeProduct(allowance: SubscriberConnectivityAllowanceInterface): Observable<SubscriberConnectivityAllowanceInterface> {

    // TODO: This is currently just a temp function to be extended when required
    return of(allowance);

}

Как вы можете видеть, на данный момент все, что она делает, это создает наблюдаемую из ее входных данных, но она находится в стадии разработки и будет расширена.

Я тестирую его с помощью Jest следующим образом:

it('should return an observable of the allowance', () => {

    const allowance: SubscriberConnectivityAllowanceInterface = {
        hotspotAuthenticated: HotspotAuthenticationEnum.TRUE,
        remainingOctets: 100,
        remainingSeconds: 200,
        activeProductCost: ConnectivityProductCostEnum.PAID,
        activeProductDuration: ConnectivityProductDurationEnum.FLIGHT,
        activeProductType: ConnectivityProductTypeEnum.PREMIUM,
        connectivityProducts: []
    };

    const expected = hot('a|', {
        a: allowance
    });

    expect(hotspotService['checkFreeProduct'](allowance)).toBeObservable(expected);

});

Однако тест не пройден из-за какой-то проблемы с синхронизацией. Наблюдаемый expected результат выглядит следующим образом:

[
  {
    "frame": 0,
    "notification": {
      "error": undefined,
      "hasValue": true,
      "kind": "N",
      "value": {
        "activeProductCost": "paid",
        "activeProductDuration": "flight",
        "activeProductType": "premium",
        "connectivityProducts": [],
        "hotspotAuthenticated": 1,
        "remainingOctets": 100,
        "remainingSeconds": 200
      }
    }
  },
  {
    "frame": 10,
    "notification": {
      "error": undefined,
      "hasValue": false,
      "kind": "C",
      "value": undefined
    }
  }
]

, а наблюдаемая, созданная из вызова функции hotspotService['checkFreeProduct'](allowance), выглядит следующим образом:

[
  {
    "frame": 0,
    "notification": {
      "error": undefined,
      "hasValue": true,
      "kind": "N",
      "value": {
        "activeProductCost": "paid",
        "activeProductDuration": "flight",
        "activeProductType": "premium",
        "connectivityProducts": [],
        "hotspotAuthenticated": 1,
        "remainingOctets": 100,
        "remainingSeconds": 200
      }
    }
  },
  {
    "frame": 0, // <------- this is the only difference
    "notification": {
      "error": undefined,
      "hasValue": false,
      "kind": "C",
      "value": undefined
    }
  }
]

Теперь я не совсем уверен почему есть две эмиссии от этих наблюдаемых, но я буду go с этим. Что я не понимаю, так это то, почему наблюдаемое из вызова функции генерирует два события, оба в кадре 0. Я пробовал оба hot() и cold(), и экспериментировал с различными шариками в этих вызовах, но без радости. Может кто-нибудь объяснить, пожалуйста?

1 Ответ

1 голос
/ 12 марта 2020

Вопрос, который вы задали о двух испущенных событиях, связан с тем, что мрамор hot('a|') - 1-й из них выдает значение, которое вы sh утверждаете 'a', а второй издает, чтобы указать завершение горячей наблюдаемой '|'. Это может быть выведено из свойства Уведомление -> Добрые в тех событиях, которые вы добавили в свой вопрос. Пример: "kind": "N" -> Значение выбрасывается. kind ":" C "-> завершение наблюдаемого.

Ответ : Чтобы исправить свой юнит-тест, просто измените мрамор на '(a|)', чтобы они оба излучались в тот же период времени. Я проверил это, и это работает.

Причина для разных временных периодов: Горячие и холодные создают наблюдаемые потоки, которые излучают значения в определенные c интервалы времени. Мраморы обозначают действия, которые происходят со временем для наблюдаемых.

  • - - обозначает единицу времени.
  • [a-z0-9] - обозначает значения, испускаемые потоком.
  • | - обозначает завершение наблюдаемого потока.
  • # - обозначает ошибку в наблюдаемом потоке.
  • () - обозначает группирование значений, выпущенных в один и тот же период времени.

Для вашего решения , hot('(a|')) - означает, что вы излучаете оба значения a и завершаете наблюдаемый поток за тот же период времени.

Список литературы: https://github.com/jisaacks/RxJS/blob/master/doc/writing-marble-tests.md https://medium.com/@bencabanes / мрамор-тестирование-обсервабл е введение-1f5ad39231 c

...