Процесс сборки Travis CI - TypeScript обнаруживает ошибку раньше, чем Mocha - PullRequest
0 голосов
/ 28 мая 2020

Это не столько ошибка, сколько компилятор TypeScript, выполняющий свою работу, однако он приводит к сбою моих сборок Travis.

В моем пакете у меня есть функция completeRound, которая принимает число как его первый аргумент, затем 3 необязательных аргумента, и, поскольку я написал его на TypeScript, я говорю ему, что ему нужно передать число в качестве первого аргумента:

function completeRound( number: number, rounding = 1, direction = 'closest', offset = 0 ): number {
  let n: number = +number,
      r: number = Math.abs(+rounding),
      d: string = direction,
      o: number = +offset;

  if (typeof n !== 'number') {
    throw new TypeError('You need to round a number!');
  }

  // Rest of the code goes here
}

Все работает нормально, Единственная проблема - это когда дело касается тестирования. В моем тестовом скрипте есть:

import completeRound from '../src/completeRound';
import { expect } from 'chai';
import 'mocha';

const expectedResults = [
  {
    testVal : {
      number    : 3.5,
      rounding  : 1,
      direction : 'down'
    },
    eR      : 3
  },
  // 40-something different tests, all passing fine
];

expectedResults.map(t => describe(`completeRound(${t.testVal.number}, ${t.testVal.rounding}, '${t.testVal.direction}', ${t.testVal.offset})`,() => {
  it(`should return ${t.eR}`, () => {
    const result = completeRound(t.testVal.number,t.testVal.rounding,t.testVal.direction,t.testVal.offset);
    expect(result).to.equal(t.eR);
  });
})); // For testing results where it shouldn't throw an error

/* This one is the problem line */
expect(() => completeRound([5])).to.throw(TypeError, /a number/);
/* ---------------------------- */

expect(() => completeRound(5,1,'arriba')).to.throw(Error, /valid rounding direction/);

Поэтому я передаю ему массив вместо числа, где я хочу, чтобы JavaScript выдавал ошибку TypeError. Очевидно, я хочу, чтобы люди, использующие это либо в JavaScript, либо в TypeScript, были одинаково охвачены. Плюс я ищу эту сладкую 100% цифру в моем отчете о покрытии. НО , из отчета ниже в Travis, мы видим, что компилятор TypeScript добирается туда первым и выдает ошибку компиляции.

TSError: ⨯ Unable to compile TypeScript:

dev/test/completeRound.spec.ts:414:28 - error TS2345: Argument of type 'number[]' is not assignable to parameter of type 'number'.

414 expect(() => completeRound([5])).to.throw(TypeError, /a number/);

Я не вижу способа, которым я может протестировать скомпилированный код, потому что это означает, что я компилирую его, я использую webpack для его компиляции, который сразу же помещает его в мою папку ./dist, просматривает его и все остальное, поэтому я не вижу, как импортировать из этого , и мне действительно не нужен двухэтапный процесс, в котором я его компилирую , а затем объединяю.

Я думаю, что короткая версия, я хочу протестировать JavaScript выдачу ошибок для ошибка, при которой TypeScript ловит ее автоматически, а JavaScript - нет.

Кто-нибудь может помочь?

1 Ответ

1 голос
/ 01 июня 2020

Я видел как минимум 2 проблемы:

  1. В функции completeRound () вы используете унарный плюс (n = + число), что означает, что n всегда имеет номер типа (НАСКОЛЬКО МНЕ ИЗВЕСТНО). Сначала вам нужно проверить «число» (первый параметр функции). Или вы можете использовать isNaN () , чтобы проверить, хотите ли вы проверить это позже. Пример (упрощенная версия):
function completeRound(number: number): number|TypeError {
  // Check the type of the first argument.
  if (typeof number !== 'number') {
    throw new TypeError('You need to round a number!');
  }
  // Before assign it.
  const n: number = +number;
  // For example if first parameter is function, n still has type number, but NaN.
  if (Number.isNaN(n)) {
    throw new TypeError('You need to round a number!');
  }
  // Rest of the code goes here
  return n;
}
Вы можете определить unknown , а затем выполнить утверждение типа . Например:
// Use unknown testVar.
const testVar:unknown = [5];
// Do type assertion on testVar.
expect(() => completeRound(testVar as number)).to.throw(TypeError, /a number/);
// Try again with function.
const testVarAgain: unknown = () => false;
expect(() => completeRound(testVarAgain as number)).to.throw(TypeError, /a number/);

Надеюсь, это поможет. Удачи.

...