Rah*_*ael 6 javascript node.js istanbul jestjs
我正在尝试使用 Jest 来测试我的代码。它工作得很好,直到我尝试从测试中排除类方法。
\nquerySelector() 调用是我想跳过此方法进行测试的原因(除非我在浏览器中运行脚本,否则“文档”显然为空)
\n我尝试了这个解决方案,这似乎是最受建议的解决方案:
\n /* istanbul ignore next */\n appendNewInputFields() {\n\n const howMany = Number(document.querySelector('#items-to-add').value);\n \n [...Array(howMany)].forEach( i => {\n const newInputField = this.createNewItemInputField();\n this.inputItemsContainerNode.append(newInputField);\n });\n }\nRun Code Online (Sandbox Code Playgroud)\n但测试一直失败,并且这条线/* istanbul ignore next */ 似乎被忽略了。
我还尝试将注释放在函数签名及其主体之间(正如此处建议的那样),但没有运气:
\n FAIL js/DOMManager.test.js\n \xe2\x97\x8f Test suite failed to run\n\n TypeError: Cannot read property 'value' of null\n\n 135 | appendNewInputFields() /* istanbul ignore next */ {\n 136 |\n > 137 | const howMany = Number(document.querySelector('#items-to-add').value);\n | ^\n 138 | \nRun Code Online (Sandbox Code Playgroud)\n我读到这可能与babel-plugin-istanbul. 我试过了
npm --save-dev uninstall babel-plugin-istanbul
在终端中返回:
\nnpm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules/fsevents):\nnpm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})\n\nremoved 18 packages and audited 521 packages in 2.178s\nRun Code Online (Sandbox Code Playgroud)\n但该文件夹babel-plugin-istanbul仍然存在于/node_modules/我的工作文件夹中,并且测试不断失败,就好像没有发生任何变化一样。
如果我注释掉函数的主体,其他测试套件就可以完美工作。如果我尝试将忽略下一个命令应用于代码的任何其他部分,测试会很好地通过并且该行将被完全忽略。
\n如果我尝试手动删除该/babel-plugin-istanbul/文件夹(从我的工作文件夹中的 /node_modules/ ),Jest 将停止工作。
(这是我第一次安装 Node.js,我这样做只是因为我想用 Jest 开始单元测试。我指出这一点是因为这是我走出普通世界的第一步。我不知道如何处理 Node.js 或 npm,我刚刚启动了几个命令来安装它,我为 Jest 编写了一些测试,它们都立即运行良好。我没有使用任何其他框架,我试图坚持尽可能使用普通 JS。)
\n- - - - - - - - - - - - 编辑:
\n我尝试将代码更改为:
\n\n appendNewInputFields() {\n // TODO solve the istanbul ignore issue\n \n let howMany;\n\n /* istanbul ignore if */\n if(document != null) {\n howMany = Number(document.querySelector('#items-to-add').value);\n \n [...Array(howMany)].forEach( i => {\n const newInputField = this.createNewItemInputField();\n this.inputItemsContainerNode.append(newInputField);\n });\n\n console.log("added " + howMany + " input fields");\n }\n }\nRun Code Online (Sandbox Code Playgroud)\n我不断得到
\n FAIL js/DOMManager.test.js\n \xe2\x97\x8f Test suite failed to run\n\n TypeError: Cannot read property 'value' of null\n\n 139 | /* istanbul ignore if */\n 140 | if(document != null) {\n > 141 | howMany = Number(document.querySelector('#items-to-add').value);\n | ^\n 142 | \n 143 | [...Array(howMany)].forEach( i => {\n 144 | const newInputField = this.createNewItemInputField();\nRun Code Online (Sandbox Code Playgroud)\n我现在完全一无所知。给定条件,“文档”应该为空,并且该块完全被跳过,但它始终无法通过测试。
\n当在浏览器中运行时,相同的代码完全按照预期工作。
\n于是我在一个空白的新文件夹中做了一些测试,终于让我震惊了。
显然我误解了 的目的/* istanbul ignore next */。
它的功能不是在测试期间跳过正在执行的代码,而是防止在确定已测试的总代码量时考虑该部分代码。代码运行(如果有任何东西调用该函数),但是当 Jest 总结它测试的行数时,这些行就不算数(我猜这就是 --coverage 的目的)。如果发生错误,则会像平常一样抛出错误。
我的问题与 Jest 或伊斯坦布尔套餐无关。我现在意识到这一点感觉很愚蠢,但我需要的只是适当的异常处理。
我实现了一些老式的 try/catch 块:现在一切都经过顺利测试,并且 istanbulignore 指令正确地按预期运行(现在我知道会发生什么):未测试并标记为忽略的函数,它们只是没有出现在最终的报道报告中。
我希望这对那些可能陷入我同样误解的人有所帮助。
当然,如果有比我更有能力的人能够证实这一解释或有任何建议或进一步解释,显然将不胜感激。
| 归档时间: |
|
| 查看次数: |
24060 次 |
| 最近记录: |