Тестирование массива объектов - Jest - PullRequest
0 голосов
/ 11 января 2020

Я хочу протестировать массив объектов. По сути, когда я запускаю тестовое покрытие для показанного массива объектов, последний объект link имеет условия, и это та часть, которая не обнаружена.

export const relatedServicesList: IRelatedServiceItem[] = [
  {
    label: 'inquiry.title',
    link: '/adc/declaration/landing',
  },
  {
    label: 'extendDeposit.title',
    link: '/adc/extend-deposit/landing',
  },
  {
    label: 'generalAdminCustomsServices.landing.title',
    link:
      window.location.host === 'stage'
        ? '/demo'
        : '/test',
  },
];

Что я пробовал

import { relatedServicesList } from './routes';
describe('Routes', () => {
  it('when host = stage', () => {
    global.window = Object.create(window);

    Object.defineProperty(window, 'location', {
      value: {
        host: 'stage',
      },
    });
    window.location.host = 'stage';
    expect(relatedServicesList[relatedServicesList.length - 1]).toEqual(
      expect.objectContaining({
        label: 'generalAdminCustomsServices.landing.title',
        link:
          'stage',
      }),
    );
  });

  it('when host != stage', () => {
    global.window = Object.create(window);

    Object.defineProperty(window, 'location', {
      value: {
        host: 'demo',
      },
    });
    window.location.host = 'demo';

    expect(relatedServicesList[relatedServicesList.length - 1]).toEqual(
      expect.objectContaining({
        label: 'generalAdminCustomsServices.landing.title',
        link: '/test',
      }),
    );
  });
});

Условная часть не обнаружена. Обратите внимание, что экспортируется только массив типа IRelatedServiceItem, функции нет и т. Д. c.

1 Ответ

1 голос
/ 13 января 2020

Существует два предостережения:

  1. Если вы используете синтаксис es6 import для импорта массива relatedServicesList, оценка (window.location.host === 'stage' ? '/demo' : '/test') перед изменением значения window.location. Мы можем использовать require для обработки этого.

  2. Вам необходимо использовать jest.resetModules () для сброса реестра модулей - кеша всех необходимых модулей. Так что для каждого теста будет новая оценка.

Вот рабочий пример: index.ts:

interface IRelatedServiceItem {
  label: string;
  link: string;
}

console.log('window.location.host: ', window.location.host);
export const relatedServicesList: IRelatedServiceItem[] = [
  {
    label: 'inquiry.title',
    link: '/adc/declaration/landing',
  },
  {
    label: 'extendDeposit.title',
    link: '/adc/extend-deposit/landing',
  },
  {
    label: 'generalAdminCustomsServices.landing.title',
    link: window.location.host === 'stage' ? '/demo' : '/test',
  },
];

index.spec.ts:

describe('59698218', () => {
  beforeEach(() => {
    jest.resetModules();
  });

  it('when host = stage', () => {
    Object.defineProperty(window, 'location', {
      value: { host: 'stage' },
      writable: true,
    });
    const { relatedServicesList } = require('./index');
    expect(relatedServicesList[relatedServicesList.length - 1]).toEqual({
      label: 'generalAdminCustomsServices.landing.title',
      link: '/demo',
    });
  });

  it('when host != stage', () => {
    Object.defineProperty(window, 'location', {
      value: { host: 'demo' },
      writable: true,
    });
    const { relatedServicesList } = require('./index');
    expect(relatedServicesList[relatedServicesList.length - 1]).toEqual({
      label: 'generalAdminCustomsServices.landing.title',
      link: '/test',
    });
  });
});

Результаты модульного тестирования со 100% покрытием:

 PASS  src/stackoverflow/59698218/index.spec.ts (8.497s)
  59698218
    ✓ when host = stage (14ms)
    ✓ when host != stage (2ms)

  console.log src/stackoverflow/59698218/index.ts:107
    window.location.host:  stage

  console.log src/stackoverflow/59698218/index.ts:107
    window.location.host:  demo

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |      100 |      100 |      100 |      100 |                   |
 index.ts |      100 |      100 |      100 |      100 |                   |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       2 passed, 2 total
Snapshots:   0 total
Time:        9.649s

Исходный код: https://github.com/mrdulin/jest-codelab/tree/master/src/stackoverflow/59698218

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