Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在单元测试中断言流类型错误_Javascript_Unit Testing_Flowtype_Assertion - Fatal编程技术网

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

Javascript 在单元测试中断言流类型错误,javascript,unit-testing,flowtype,assertion,Javascript,Unit Testing,Flowtype,Assertion,我们使用JavaScript进行静态类型检查。流类型可能会变得复杂,我们曾经遇到过一些问题,我们认为我们有很好的静态类型保护来防止格式错误的对象,但是流注释问题意味着类型检查实际上并没有捕获问题 为了防止这个问题,我想编写基于类型的“单元测试”,它可以静态地断言我们关于类型保护的假设。如果我想使用以下方法断言“有效”案例,这很容易: 如果用户是有效的用户,则此操作将通过,如果不是,则类型检查将失败 然而,为了断言类型检查提供给我们的实际保护,我需要能够断言流错误。例如,假设我想确认这是无效的:

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

为了防止这个问题,我想编写基于类型的“单元测试”,它可以静态地断言我们关于类型保护的假设。如果我想使用以下方法断言“有效”案例,这很容易:

如果
用户
是有效的
用户
,则此操作将通过,如果不是,则类型检查将失败

然而,为了断言类型检查提供给我们的实际保护,我需要能够断言流错误。例如,假设我想确认这是无效的:

const user = {name: "Bob", age: 40};
我可以通过考试

// $ExpectError
const user = {name: "Bob", age: 40};
但我不能让它失败

// $ExpectError
const user = {name: "Bob"};
显然,这个示例非常简单,但是更复杂的类型(例如,使用泛型)可以从这种类型的测试中受益

我考虑过的选择:

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

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

要断言单元测试中的某些代码行应该引发流错误,只需在这些代码行上方写一条流错误抑制注释,然后在整个单元测试文件夹(或整个代码库)上运行
flow check--max warnings 0
,并断言该命令具有0退出状态(无错误或警告)。您不需要在每个单元测试文件上单独运行这些命令

如所述,如果您在实际不会触发流错误的行上方写入抑制注释(如
//$FlowExpectError
),流将发出警告

假设您定义了
suppress\u注释
以将
$FlowExpectError
理解为抑制注释,那么单元测试就是这样的:

//此类型定义可以从其他文件导入
类型用户={|
名称:string
|};
//检查流是否不会引发正确用法的错误
const user={name:“Bob”};
//检查流是否因使用不当而引发错误
//$FlowExpectError
const user={name:“Bob”,年龄:40};

如果在包含此文件的文件夹上运行
流检查--max warnings 0
,并且命令成功退出,然后,您对
用户类型的测试通过。

根据流,如果没有错误被抑制,则应该发出警告。这个答案的唯一问题是,它在当前版本的流中实际上不起作用。未使用的类型抑制是一个警告,而不是一个错误,当Flow显示警告时,它将以0退出。@nrabinowitz我编辑了我的答案以解决该问题。流有一个内置标志
--max warnings
,用于在出现警告时更改退出状态。我忘了这是必要的,因为我通常处理的项目默认启用了它。
// $ExpectError
const user = {name: "Bob"};