Jest's `it.each ()` описание для визуализации исходного кода функции стрелки, когда упоминается как $ предикат - PullRequest
1 голос
/ 09 января 2020

Определение проблемы

Jest позволяет использовать данные тестового примера в it.each name через $ переменные с префиксом.

Приведенный ниже код приводит к выводу например:

 PASS  src/array-functions/find-pairwise.spec.ts
  findPairwise
    √ should return [1, 2] for [1, 2, 3] and [Function anonymous] (7ms)
    √ should return [1, 2] for [1, 2, 3] and [Function anonymous] (1ms)
    √ should return [2, 3] for [1, 2, 3] and [Function anonymous]
    √ should return [2, 3] for [1, 2, 3] and [Function anonymous] (1ms)
    √ should return [undefined, undefined] for [1, 2, 3] and [Function anonymous]

Test Suites: 1 passed, 1 total
Tests:       5 passed, 5 total
Snapshots:   0 total
Time:        4.061s
Ran all test suites related to changed files.

Как видите, переменные $expected и $array отображаются в удобной для человека форме (в данном случае массивы basi c JavaScript). Однако $predicate показывает общий c текст [Function anonymous] вместо его фактического кода. Я знаю, что и обычные функции, и функции стрелок в JS могут выставлять их исходный код, если вы вызываете .toString() для них. Есть ли способ проинструктировать Jest отнести результат этого toString() вызова? Я пробовал $predicate.toString() и $(predicate.toString()), но ни один из них не работал.

enter image description here

Код

import { findPairwise } from './find-pairwise';

describe(findPairwise.name, () => {
  it.each`
    array        | predicate                                | expected
    ${[1, 2, 3]} | ${(l: number, r: number) => l === 1}     | ${[1, 2]}
    ${[1, 2, 3]} | ${(l: number, r: number) => r === 2}     | ${[1, 2]}
    ${[1, 2, 3]} | ${(l: number, r: number) => r === 3}     | ${[2, 3]}
    ${[1, 2, 3]} | ${(l: number, r: number) => l + r === 5} | ${[2, 3]}
    ${[1, 2, 3]} | ${(l: number, r: number) => l === r }    | ${[undefined, undefined]}
  `
  ('should return $expected for $array and $predicate', ({ array, predicate, expected }) => {
//                                         ^^^^^^^^^^
//                                         ||||||||||
//                                         I'd like this to be rendered
//                                         as the code of the arrow function.
//                                         E.g. "(l: number, r: number) => l === 1"
//                                         ...or something close to it.

    expect(findPairwise(array, predicate)).toEqual(expected);
  });
});

1 Ответ

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

Когда вы используете помеченный шаблон литерал для параметра table параметра it.each, jest использует библиотеку pretty-format за сценой для создания заголовка из тестовые данные (если тестовые данные не являются примитивным типом).

К сожалению, для ваших целей библиотека pretty-format, похоже, не использует метод toString из функций для их форматирования.

В качестве альтернативного решения вы можете использовать версию массива для параметра table:

it.each([
    [ [1, 2], [1, 2, 3], (l, r) => l === 1 ],
    [ [1, 2], [1, 2, 3], (l, r) => r === 2 ],
    [ [2, 3], [1, 2, 3], (l, r) => r === 3 ],
    [ [2, 3], [1, 2, 3], (l, r) => l + r === 5 ],
    [ [undefined, undefined], [1, 2, 3], (l, r) => l === r ],
])
('should return %p for %p and %s', (expected, array, predicate) => {
    expect(findPairwise(array, predicate)).toEqual(expected);
});

Обратите внимание, что я изменил порядок параметров так, чтобы ожидаемое значение находится на первом месте. Это потому, что отображение между тестовыми данными и заполнителями в заголовке основано на порядке в версии массива table для it.each.

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