【问题标题】:"istanbul ignore next" command seems to be ignored“伊斯坦布尔忽略下一个”命令似乎被忽略了
【发布时间】:2021-06-06 11:34:56
【问题描述】:

我正在尝试使用 Jest 来测试我的代码。在我尝试从测试中排除一个类方法之前,它工作得很好。

querySelector() 调用是我想跳过此方法进行测试的原因(“文档”显然为空,除非我在浏览器中运行脚本)

我试过这个解决方案,似乎是最推荐的一个:

  /* istanbul ignore next */
  appendNewInputFields() {

    const howMany = Number(document.querySelector('#items-to-add').value);
    
    [...Array(howMany)].forEach( i => {
      const newInputField = this.createNewItemInputField();
      this.inputItemsContainerNode.append(newInputField);
    });
  }

但测试一直失败,/* istanbul ignore next */ 行似乎被忽略了。

我也尝试将注释放在函数签名和它的主体之间(正如这里某处建议的那样),但没有运气:

 FAIL  js/DOMManager.test.js
  ● Test suite failed to run

    TypeError: Cannot read property 'value' of null

      135 |   appendNewInputFields() /* istanbul ignore next */ {
      136 |
    > 137 |     const howMany = Number(document.querySelector('#items-to-add').value);
          |                            ^
      138 |     

我读到过这可能与babel-plugin-istanbul 有关。我试过了

npm --save-dev uninstall babel-plugin-istanbul

在终端返回:

npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.2 (node_modules/fsevents):
npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.2: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"})

removed 18 packages and audited 521 packages in 2.178s

但文件夹 babel-plugin-istanbul 仍然存在于我的工作文件夹内的 /node_modules/ 中,并且测试一直失败,好像没有任何变化。

如果我注释掉函数的主体,其他测试套件可以完美运行。如果我尝试将 ignore next 命令应用于代码的任何其他部分,则测试通过就好了,该行将被完全忽略。

如果我尝试手动删除 /babel-plugin-istanbul/ 文件夹(从我的工作文件夹中的 /node_modules/ 删除),Jest 将停止工作。

(这是我第一次安装 Node.js,我这样做只是因为我想用 Jest 开始单元测试。我指出这一点是因为这是我走出原版世界的第一步。我不知道如何处理 Node.js 和 npm,我刚刚启动了几个命令来安装它,我为 Jest 编写了一些测试,它们都立即运行良好。我没有使用任何其他框架,我尽量坚持原版 JS。)

----------------------- 编辑:

我尝试将代码更改为:


  appendNewInputFields() {
    // TODO solve the istanbul ignore issue
    
    let howMany;

    /* istanbul ignore if */
    if(document != null) {
      howMany = Number(document.querySelector('#items-to-add').value);
    
      [...Array(howMany)].forEach( i => {
        const newInputField = this.createNewItemInputField();
        this.inputItemsContainerNode.append(newInputField);
      });

      console.log("added " + howMany + " input fields");
    }
  }

我不断得到

 FAIL  js/DOMManager.test.js
  ● Test suite failed to run

    TypeError: Cannot read property 'value' of null

      139 |     /* istanbul ignore if */
      140 |     if(document != null) {
    > 141 |       howMany = Number(document.querySelector('#items-to-add').value);
          |                        ^
      142 |     
      143 |       [...Array(howMany)].forEach( i => {
      144 |         const newInputField = this.createNewItemInputField();

在这一点上我完全一无所知。鉴于条件,“文档”应该为空,并且该块完全跳过,但它一直未能通过测试。

相同的代码在浏览器中运行时完全符合预期。

【问题讨论】:

    标签: javascript node.js jestjs istanbul


    【解决方案1】:

    我在使用 window.alert 命令时遇到了同样的错误:

    ReferenceError: alert is not defined
    
      4 |
      5 | /* istanbul ignore next */
    > 6 | alert(helloWorld());
        | ^
      7 |
    

    所以我尝试使用 try-catch 和 SUCCESS!

    之前:

    alert(helloWorld());
    

    之后:

    const alerta = () => {
      try {
        return alert(helloWorld());
      } catch (error) {
          return false;
      }
    }
    

    睾丸:

    Test Suites: 1 passed, 1 total
    Tests:       1 passed, 1 total
    

    【讨论】:

      【解决方案2】:

      所以我在一个空白的新文件夹中做了一些测试,最终让我印象深刻。

      显然我误解了/* istanbul ignore next */的目的。

      它的作用不是在测试期间跳过代码执行,而是在确定已测试的总代码量时防止将那部分代码考虑在内。代码运行(如果有任何东西调用该函数),但是当 Jest 总结它测试的行数时,这些行不计算在内(我猜这是 --coverage 的目的)。如果发生错误,它会像往常一样被抛出。

      我的问题与 Jest 或 istanbul 包无关。我现在意识到这一点感觉很愚蠢,但我需要的只是适当的异常处理。

      我实现了一些老式的 try/catch 块:现在一切都顺利进行了测试,并且 istanbul ignore 指令按预期正确运行(现在我知道会发生什么):未测试并标记为的函数忽略,它们只是不会出现在最终的覆盖率报告中。

      我希望这对可能遇到我同样误解的人有所帮助。

      当然,如果有比我更有能力的人能证实这种解释,或者有任何建议或进一步的解释,显然不胜感激。

      【讨论】:

      • 你是对的——istanbul 是一个代码覆盖包。小心你的尝试/捕获;您可能会发现您正在尝试测试的异常。在您的测试用例中使用像 if(!window) return; 这样的提前退出会更好。
      • 但是window 不会总是虚假并阻止任何与 DOM 操作相关的测试吗?想一想,这实际上是我试图用if(document != null) 做的,只是我把它放在 .js 文件而不是 .test.js 中,这可能就是它不起作用的原因。非常感谢您的洞察力,我会进一步研究。
      • 窗口在浏览器中或 e. G。 Jsdom 已在全球范围内设置完毕。
      猜你喜欢
      • 2021-02-21
      • 1970-01-01
      • 1970-01-01
      • 2021-10-28
      • 2016-09-30
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2022-01-20
      相关资源
      最近更新 更多