Шутка: проверка функции, переданной в объект, завершается с ошибкой «Получено: сериализуется в ту же строку»

#javascript #arrays #unit-testing #oop #jestjs

#javascript #массивы #модульное тестирование #ооп #jestjs

Вопрос:

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

 const injectArray = (arr, fn) => {
  arr.map((el) => ({
    ...el,
    fn: () => fn(el),
  }));
};
  

Тест для этого выглядит так:

 const mockFn = jest.fn();

describe('injectArray()', () => {
  it('returns a new array with the function injected into the objects', () => {
    expect(injectArray([{
      name: 'John Doe',
      age: 25
    }], mockFn)).toEqual([{
      name: 'John Doe',
      age: 25,
      fn: () => mockFn();
    }]);
  });
});
  

Тест завершается с ошибкой

 Expected: [{"name": "John Doe", age: 25, "fn": [Function mockFn]}]
Received: serializes to the same string
  

Когда я меняю тест на toContainEqual() , я получаю

 Expected value: [{"name": "John Doe", age: 25, "fn": [Function mockFn]}]
Received array: [{"name": "John Doe", age: 25, "fn": [Function mockFn]}] 
  

Я считаю, что Jest не может сравнивать сериализованные функции и поэтому терпит неудачу, но как я могу избежать этого в этом конкретном случае использования, когда мне нужно передать функцию в объект?

Ответ №1:

Вы правы, jestjs не можете сравнить сериализованные функции. Вы могли бы использовать expect.any (конструктор).

Например.

index.ts :

 const injectArray = (arr, fn) => {
  return arr.map((el) => ({
    ...el,
    fn: () => fn(el),
  }));
};

export {injectArray}
  

index.test.ts :

 import {injectArray} from './'

const mockFn = jest.fn();

describe('injectArray()', () => {
  it('returns a new array with the function injected into the objects', () => {
    expect(injectArray([{
      name: 'John Doe',
      age: 25
    }], mockFn)).toEqual([{
      name: 'John Doe',
      age: 25,
      fn: expect.any(Function)
    }]);
  });
});
  

результат модульного теста с отчетом о покрытии:

  PASS  src/stackoverflow/63957885/index.test.ts
  injectArray()
    ✓ returns a new array with the function injected into the objects (4ms)

----------|----------|----------|----------|----------|-------------------|
File      |  % Stmts | % Branch |  % Funcs |  % Lines | Uncovered Line #s |
----------|----------|----------|----------|----------|-------------------|
All files |       80 |      100 |    66.67 |       75 |                   |
 index.ts |       80 |      100 |    66.67 |       75 |                 4 |
----------|----------|----------|----------|----------|-------------------|
Test Suites: 1 passed, 1 total
Tests:       1 passed, 1 total
Snapshots:   0 total
Time:        5.249s, estimated 13s
  

Комментарии:

1. @Jacob Кроме того, вам необходимо протестировать анонимную функцию, чтобы достичь 100% тестового покрытия