如何构建可运行的JavaScript规范

  介绍

这篇文章给大家分享的是有关如何构建可运行的JavaScript规范的内容。小编觉得挺实用的,因此分享给大家做个参考。一起跟随小编过来看看吧。

编程不仅仅是给计算机下达如何完成一项任务的指令,它还包括以一种精确的方式与他人交流思想,甚至是与未来的自己。这样的交流可以有多个目标,也许是为了共享信息,或者只是为了更容易地修改,如果你不理解或不记得很久以前做过什么,那么就很难修改。

当我们编写软件时,我们还需要确保代码具有预期的功能,虽然有定义语义的正式方法,但是最简单,最快速(但不那么严格)的方法是将该功能投入使用,并查看它是否产生预期的结果。

大多数开发人员都熟悉这些实践:代码文档作为注释来明确代码块的目标,以及一系列测试来确保函数给出所需的输出。

但是通常文档和测试是在不同的步骤中完成的。通过统一这些实践,我们可以为参与项目开发的任何人提供更好的体验。本文探讨了一个简单的程序实现,该程序可以运行既适用于文档编写又适用于测试的JavaScript规范。

我们将构建一个命令行界面,该界面将查找目录中的所有规范文件,提取每个规范中找到的所有断言,并计算它们的结果,最后显示哪些断言失败了,哪些断言通过了。

<强>规范的格式

每个规范文件将从模板文本导出一个字符串。第一行可以作为规范的标题。模板文字将允许我们在字符串之间嵌入JS表达式,每个表达式将表示一个断言。要识别每个断言,我们可以用一个独特的字符开始行。

在本例中,我们可以使用酒吧字符(|)和破折号(-)的组合,破折号类似于旋转门符号,有时可以将其作为逻辑断言的符号表示。

下面是一个例子,对它的用法做了一些解释:

const依赖=要求(& # 39;。/依赖# 39;)模块。出口='   规范文件的例子      这个项目允许测试JavaScript程序使用规范文件。   每一个* .spec。js文件出口单个模板文字,包括一般   解释被指定的文件。每个文件表示一个逻辑   组件的一个更大的系统。每个逻辑组件是由几个   单位的功能,可以测试对某些属性。   每个> # !/usr/bin/env节点   const fs=要求(& # 39;fs # 39;)   const path=需要()& # 39;path & # 39;   const specRegExp=/\ .spec \ . js/美元   const目标=path.join (process.cwd (), process.argv [2])//获得所有的规范文件路径//如果提供了规范文件然后测试文件//否则找到所有规范文件的目标目录   const路径=specRegExp.test(目标)   ? (目标)   specRegExp: findSpecifications(目标)。过滤器(x=比;x)//得到每个规范文件的内容//得到每个规范文件的断言   const assertionGroups=getAssertions (getSpecifications(路径))//日志的所有断言   logAssertions (assertionGroups)//检查任何断言失败,并返回一个适当的退出代码   的过程。exitCode=checkAssertions (assertionGroups)

因为这也是我们的CLI(命令行接口)的入口点,所以我们需要添加第一行工作,它表示这个文件应该由节点程序执行。不需要添加特定的库来处理命令选项,因为我们只对单个参数感兴趣。但是,如果您计划以相当大的方式扩展此程序,则可以考虑其他选项。

要获得目标测试文件或目录,我们必须将执行命令的路径(使用process.cwd())与用户提供的参数作为执行命令时的第一个参数(使用process.argv[2])连接起来。

您可以在过程对象的node . js文档中找到对这些值的引用。通过这种方法,我们获得了目标目录/文件的绝对路径。

现在,我们要做的第一件事是找到所有的JavaScript规范文件。如第12行所示,我们可以使用条件运算符来提供更大的灵活性:如果用户提供了一个规范文件作为目标然后我们就直接使用,文件路径。

否则,如果用户提供了一个目录路径然后我们必须找到相匹配的所有文件模式specRegExp定义的常数,我们使用findSpecifications函数以后,我们将定义。这个函数将返回目标目录中每个规范文件的路径数组。

在第18行中,我们通过组合两个函数getspecification()和getassertion()来定义assertionGroups常量。首先获取每个规范文件的内容,然后从中提取断言。

我们稍后将定义这两个函数,现在只需要注意,我们使用第一个函数的输出作为第二个函数的参数,从而简化了过程,并在这两个函数之间建立了直接的联系。

虽然我们可以只有一个函数,通过拆分它们,我们可以更好地了解什么是实际的过程,但请记住,程序应该清晰易懂;仅仅做到这一点是不够的。

如何构建可运行的JavaScript规范