TSNode + Mocha: игнорировать ошибки TypeScript (заставлять компилятор генерировать ошибки и заставлять TSNode выполнять генерируемый код) - PullRequest
0 голосов
/ 02 мая 2020

В приведенном ниже коде, хотя функция test2 недействительна, это не должно влиять на тестирование функции test1:

export function test1(): boolean {
  return true;
}

export function test2(): number {
  return "1";
}

Тест:

import { assert as Assert } from "chai";
import { test1 } from "./example";


describe("Example", (): void => {
  it("Example", (): void => {
    Assert.isTrue(test1());
  });
});

Однако Мокко , выполненный TSNode, потерпит неудачу:

TSError: ⨯ Unable to compile TypeScript:
Source/ProjectBuilder/example.ts(6,3): error TS2322: Type '"1"' is not assignable to type 'number'.

Возможно ли заставить TSNode завершить вышеуказанный тест? У TypeScript есть опция noEmitOnError ...

Мой mochar c .yaml:

extension:
  - ts
spec: "**/*.test.ts"
require:
  - ts-node/register
  - tsconfig-paths/register

Зачем мне это нужно

Согласно Чистая архитектура , «Деловые правила не должны ни от чего зависеть, и они должны быть проверяемыми». Но даже если бизнес-правила не зависят от представлений, контроллеров и т. Д. c., Мы не сможем проверить это, если какие-либо ошибки в представлениях, контроллерах и т. Д. c. существует.

Когда я изменяю бизнес-логику c в своем приложении, все, что от нее зависит, становится недействительным. Предположим, что в моей сущности в бизнес логи c type User { name: string; age: number } было изменено на тип Пользователь { fullName: string; age: string; }. Все, что зависит от бизнес-логики c (представление, контроллеры, докладчики и т. Д. c.), Становится недействительным - мне тоже нужно исправить это в соответствии с обновленной бизнес-логикой c.

// In business rules:

type User = { 
  ID: number;
  fullName: string; 
  age: string; // in past - number
}

// In controller:

class UserProfileController {
  // ...
  // All what comes from input field is string    ↓
  private onClickChangeUserAge(inputtedUserAge: string) {
    // This expression obeys to previous version of business rules!
    this.targetUser.age = Number(inputtedUserAge);
    // TypeScript will emit type error, when I try to test business rules,
    // however business rules does not depend on controller.
  }
}

Однако В большом приложении это исправление может занять дни, недели и месяцы. То, как мы можем получить обратную связь, доказывает, что по крайней мере бизнес-логика c работает правильно, и мы на правильном пути?

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Нет смысла просить Typescript игнорировать типы. То, что вы описываете, похоже на запрос калькулятора, который подтверждает, что 2 + 2 = 5, только временно, потому что в конечном итоге вы будете запрашивать 2 + 3 = 5, но это может занять очень много времени.

в вашем вопросе предполагается, что number и string достаточно совместимы, чтобы ваша бизнес-логика c была исправной независимо от того, вернет ли test2 1 или "1". Это не так: например, 1 + 1 == 2, "1" + 1 == "11" и "1" - 1 == 0. В зависимости от того, какое из них применимо к вашему делу, игнорирование типов может позволить вам протестировать бизнес-логику c или может дать вам ложную уверенность в сломанной системе. Рискну предположить, что в общем случае типы данных считаются частью бизнес-логики c, которую вы пытаетесь проверить - как будет выглядеть модель данных, если не бизнес-логики c?

Вместо этого вы описываете постепенную миграцию , во время которой бизнес-правила гарантируют, что test2 вернет string | number. Точно описав миграцию в системе типов, вы сможете подтвердить, что бизнес-логика c применяется правильно - , если это верно для вашей миграции - и также предоставить тип, который вы можете применяются только из определенных модулей и сайтов вызовов, которые могут быть ужесточены после завершения sh миграции.

0 голосов
/ 06 мая 2020
type User = { 
  ID: number;
  fullName: string; 
  age: string | number
}

Вы можете указать оба типа, чтобы упростить миграцию, и не использовать //@ts-ignore везде.

Это добавит правильные предложения везде, например:

enter image description here

...