Покрытие Jest действует странно на отдельных операторах if с использованием машинописного текста - PullRequest
2 голосов
/ 05 мая 2020

Кажется, что шутка не может охватить ни одного оператора if. Это функция, которую я хочу протестировать:

...  
load(): void {
    glob.sync('**/*.docs.json').forEach((file) => {
      const f = require(file);

      if (f.tags) this.doc.tags = f.tags;
});

Я написал следующий тест:

import path from 'path';

import Sample from './sample';

const mockedJsonConfigFile = __dirname + '/test.json';

jest.mock('glob', () => {
  return {
    sync: () => [mockedJsonConfigFile],
  };
});

describe('Sample test', () => {
  let sample: Sample;

  beforeAll(() => {
    sample = new Sample();
  });

  it('Should load file correctly', () => {
    const mockResolveFile = jest.spyOn(path, 'resolve');

    sample.load();

    let jsonFileCalled = false;
    // check if the json file is called
    mockResolveFile.mock.calls.forEach((c) => {
      if (typeof c == 'object' && c.includes(mockedJsonConfigFile)) {
        jsonFileCalled = true;
      }
    });

    expect(jsonFileCalled).toBeTruthy();
    expect(sample.doc.tags.length).toBe(2);
  });
});

Он загружает файл фикстуры, содержащий объект из 2 тегов:

{
  "tags": ["tag1", "tag2"]
}

Итак, когда я запускаю тест, он сообщает мне, что строка 15 (оператор if) не покрывается, но я не понимаю, почему, поскольку в моем тесте указано, что в массиве тегов должно быть 2 элемента.

Есть ли способ обхода этого?

jest

1 Ответ

1 голос
/ 06 мая 2020

Это не подтверждает, что именно делает load:

expect(sample.doc.tags.length).toBe(2);

Он проверяет, что tags подобен массиву, но не то, что это точно, и условие, на которое оно было назначено.

Текущий макет glob не подходит для этого сценария тестирования, потому что он безусловный. Лучше сделать glob.sync шпионом, чтобы реализация могла быть изменена в разных тестах, тогда его можно смоделировать для возврата путей к разным JSON фикстурам. В качестве альтернативы, макет glob.sync может оставаться таким же, если макет файла JSON отсутствует без файла фикстуры.

Его можно протестировать следующим образом:

jest.spyOn(glob, 'sync').mockReturnedValue([__dirname + '/test.json']);

...

const testJsonMock = { "tags": ["tag1", "tag2"] };
jest.mock(__dirname + '/test.json', () => testJsonMock);
sample.load();
expect(sample.doc.tags).toBe(testJsonMock.tags);

...

const testJsonMock = { "tags": null };
jest.mock(__dirname + '/test.json', () => testJsonMock);
sample.load();
expect(sample.doc.tags).toBeFalsy();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...