TSNode + Mocha:忽略TypeScript错误(使编译器产生错误并使TSNode执行发出的代码)

问题描述 投票:0回答:2

在下面的代码中,尽管功能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执行的Mocha将失败:

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

可以强制TSNode完成上述测试吗? TypeScript具有选项noEmitOnError ...

我的mocharc.yaml:

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

为什么需要它

根据Clean Architecture,“业务规则不得依赖任何东西,并且必须是可测试的”。但是,即使业务规则不依赖于视图,控制器等,如果视图,控制器等中存在某些错误,我们也无法对其进行测试。

当我在应用程序中修改业务逻辑时,所有依赖于它的都将变为无效。假设在我的实体中,业务逻辑type User { name: string; age: number }已更改为键入用户{ fullName: string; age: string; }。所有依赖于业务逻辑(视图,控制器,演示者等)的都是无效的-我也需要根据对业务逻辑的更新对其进行更正。

// 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.
  }
}

但是,在大型应用程序中,此更正可能需要几天,几周和几个月的时间。我们如何获得反馈证明至少业务逻辑正常运行并且我们采取了正确的方式?

node.js typescript mocha ts-node
2个回答
1
投票

您让Typescript忽略类型毫无意义。您所描述的类似于要求计算器仅暂时确认2 + 2 = 5,因为最终您将要求2 + 3 = 5,但这可能需要很长时间。

您的问题的假设是numberstring足够兼容,因此无论test2返回1还是"1",您的业务逻辑都将是合理的。这是不正确的:例如,1 + 1 == 2"1" + 1 == "11""1" - 1 == 0。根据哪种情况适合您的情况,不考虑类型可能使您能够测试业务逻辑,或者使您对损坏的系统有错误的信心。我敢大胆地说,一般而言,数据类型将作为您要验证的业务逻辑的一部分-如果不是业务逻辑,数据模型将被视为什么?

相反,您要描述的是逐步迁移,在此期间,业务规则确保test2返回string | number。通过在类型系统中准确描述迁移,您可能能够确认业务逻辑正确应用-如果在整个迁移中都是这样-并且还提供了只能从某些模块中应用的类型并致电可以在迁移完成后收紧的网站。


0
投票
type User = { 
  ID: number;
  fullName: string; 
  age: string | number
}

您可以同时指定这两种类型,以使迁移更加容易,并且不在各处使用//@ts-ignore

这将在所有地方添加适当的建议,例如:

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.