Неправильные типы для Jest test.each - PullRequest
1 голос
/ 12 апреля 2020

Поэтому я использую Jest#test.each для запуска некоторых модульных тестов.

Вот фактический код:

const invalidTestCases = [
  [null, TypeError],
  [undefined, TypeError],
  [false, TypeError],
  [true, TypeError],
];

describe('normalizeNames', () => {
  describe('invalid', () => {
    test.each(invalidTestCases)('some description for (%p, %p)', (actual, expected) => {
      expect(() => normalizeNames(actual as any)).toThrowError(expected);
    });
  });

  describe('valid', () => {
    // ...
  });
});

проблема в том, что я не могу запустить это из-за ошибок машинописи:

Argument of type '(actual: boolean | TypeErrorConstructor | null | undefined, expected: boolean | TypeErrorConstructor | null | undefined) => void' is not assignable to parameter of type '(...args: (TypeErrorConstructor | null)[] | (TypeErrorConstructor | undefined)[] | (boolean | TypeErrorConstructor)[]) => any'.
      Types of parameters 'actual' and 'args' are incompatible.
        Type '(TypeErrorConstructor | null)[] | (TypeErrorConstructor | undefined)[] | (boolean | TypeErrorConstructor)[]' is not assignable to type '[boolean | TypeErrorConstructor | null | undefined, boolean | TypeErrorConstructor | null | undefined]'.
          Type '(TypeErrorConstructor | null)[]' is missing the following properties from type '[boolean | TypeErrorConstructor | null | undefined, boolean | TypeErrorConstructor | null | undefined]': 0, 1
           test.each(invalidTestCases)('some description for (%p, %p)', (actual, expected) => {
                                                       ~~~~~~~~~~~~~~~~~~~~~~~

Я также попытался использовать array из objects вместо 2d array, например так:

const invalidTestCases = [
  { actual: null, expected: TypeError },
  { actual: undefined, expected: TypeError },
  { actual: false, expected: TypeError },
  { actual: true, expected: TypeError },
];

describe('normalizeNames', () => {
  describe('invalid', () => {
    test.each(invalidTestCases)('some description for (%p, %p)', ({ actual, expected }) => {
      expect(() => normalizeNames(actual as any)).toThrowError(expected);
    });
  });

  describe('valid', () => {
    // ...
  });
});

... но при этом я не могу получить правильное описание теста для object значений.

Ответы [ 2 ]

1 голос
/ 12 апреля 2020

Поскольку все значения expected равны, вы можете просто использовать массив 1d и передать TypeError непосредственно в toThrowError. Это было бы что-то вроде этого:

const invalidTestCases = [
  null,
  undefined,
  false,
  true,
];

describe('normalizeNames', () => {
  describe('invalid', () => {
    test.each(invalidTestCases)('some description for (%p)', actual => {
      expect(() => normalizeNames(actual as any)).toThrowError(TypeError);
    });
  });

  describe('valid', () => {
    // ...
  });
});
1 голос
/ 12 апреля 2020

Я сейчас не где-то, и я могу это проверить, но добавление аннотаций типов обычно исправляет эту ошибку.

Так что, возможно, попробуйте:

type testCaseErrorTypes = null|undefined|boolean
const invalidTestCases: [testCaseErrorTypes, typeof TypeError][] = [
  [null, TypeError],
  [undefined, TypeError],
  [false, TypeError],
  [true, TypeError],
];
test.each(invalidTestCases)('some description for (%p, %p)', (actual, expected) => { … }

Это должно преобразовать invalidTestCases из (testCaseErrorTypes|TypeError)[][] в правильный тип [testCaseErrorTypes, TypeError][].

...