代码之家  ›  专栏  ›  技术社区  ›  nrabinowitz

在单元测试中断言流类型错误

  •  2
  • nrabinowitz  · 技术社区  · 7 年前

    我们使用 Flow 用于JavaScript中的静态类型检查。流类型可能会变得复杂,我们曾经遇到过这样的问题:我们认为我们有很好的静态类型保护来防止格式错误的对象,但是流注释问题意味着类型检查实际上并没有捕捉到问题。

    为了防止这个问题,我想编写基于类型的“单元测试”,它可以静态地断言我们关于类型保护的假设。如果我想使用 type assertions :

    type User = {|
        name: string
    |};
    
    const user = {name: "Bob"};
    (user: User);
    

    如果 user 是有效的 User ,如果不是,则类型检查失败。

    但是,为了断言类型检查提供的实际保护,我需要能够断言流 错误 . 例如,假设我想确定这是无效的:

    const user = {name: "Bob", age: 40};
    

    我可以通过考试

    // $ExpectError
    const user = {name: "Bob", age: 40};
    

    // $ExpectError
    const user = {name: "Bob"};
    

    显然,这个例子非常简单,但是更复杂的类型(例如,使用泛型)可以从这种类型的测试中受益。

    • 我可能会逃跑 flow 作为特定文件上的外部进程,然后断言它返回了错误,但这将要求每个测试用例有一个文件
    • 我可以用 flow-runtime 在运行时访问类型并在单元测试中使用它们,但这不提供静态断言

    有没有任何方法可以静态地断言流断言应该失败,如果失败则抛出错误?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Rory O'Kane Erce    7 年前

    flow check --max-warnings 0 在整个unittests文件夹(或整个代码库)上,并断言该命令具有0退出状态(没有错误或警告)。您不需要单独在每个单元测试文件上运行这些命令。

    documentation for suppress_comment 表示,如果您编写抑制注释(如 // $FlowExpectError 在实际上不会触发流错误的行上方。

    取消\u注释 $FlowExpectError 作为一个注释,您的单元测试是这样的:

    // this type definition could be imported from another file
    type User = {|
        name: string
    |};
    
    // Check that Flow doesn’t raise an error for correct usages
    const user = {name: "Bob"};
    
    // Check that Flow does raise an error for incorrect usages
    // $FlowExpectError
    const user = {name: "Bob", age: 40};
    

    如果你跑了 流量检查--最大警告0 在包含此文件的文件夹上,命令成功退出,然后对 User 类型已通过。