#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% тестового покрытия