【问题标题】:Running a single test file运行单个测试文件
【发布时间】:2017-04-29 05:06:06
【问题描述】:

有没有办法为单个文件而不是整个测试套件运行ng test?理想情况下,我希望在编辑文件时获得最快的反馈循环,但是karma 在每次保存时都会执行整个套件,当您构建足够大的测试套件时会有点慢。


这与How to execute only one test spec with angular-cli 的不同之处在于,该问题是关于运行单个规范的。这是关于运行单个文件。该解决方案涉及相同的 Jasmine 规范功能,但问题的性质略有不同。

【问题讨论】:

标签: angular jasmine angular-cli karma-runner


【解决方案1】:

我发现 Jasmine 允许您在 describeit 方法前加上 f(用于焦点):fdescribefit。如果您使用其中任何一个,Karma 将只运行相关测试。要关注当前文件,您只需将顶级describe 更改为fdescribe。如果您使用 Jasmine 2.1 之前的版本,则重点关键字为:iitddescribe

此示例代码只运行第一个测试:

// Jasmine versions >/=2.1 use 'fdescribe'; versions <2.1 use 'ddescribe'
fdescribe('MySpec1', function () {
    it('should do something', function () {
        // ...
    });
});

describe('MyOtherSpec', function () {
    it('should do something else', function () {
        // ...
    });
});

Here 是有关聚焦规格的 Jasmine 文档,here 是相关的 SO 文章,提供了其他周到的解决方案。

【讨论】:

  • 传奇答案
  • 不敢相信如此重要的功能不是更明显和直接。
  • 它可以工作,但并不理想,因为您需要更改源代码,并且最终可以在源代码管理中签入修改后的代码。
  • 请尽可能添加指向official documentation的链接
  • 好的 fdescribe 是一种选择。但是如果项目有 100 个规范文件呢?并且您只想运行一个规范文件? ng test 编译所有文件...
【解决方案2】:

如果您将规范文件指定为参数,则可以使用。

例如:

ng test foo.spec.ts

【讨论】:

  • 您能指定您使用的是哪个版本吗?不适用于 1.7.x
  • 它对我来说也不起作用。但是我将它修改为在规范文件的路径之前使用 --main 选项。我使用带有正斜杠的绝对路径。没试过相对路径。使用 Angular 6。不确定它是否是最好的解决方案,但它似乎对我有用。
【解决方案3】:

值得一提的是,您可以在xdescribexit 评论的情况下禁用特定测试

xdescribe('Hello world', () => { 
  xit('says hello', () => { 
    expect(helloWorld())
        .toEqual('Hello world!');
  });
});

正如有人已经说过,如果你想专注于一些测试,那么 fdescribefit

fdescribe('Hello world', () => { 
  fit('says hello', () => { 
    expect(helloWorld())
        .toEqual('Hello world!');
  });
});

【讨论】:

    【解决方案4】:

    使用

    ng test --main file.spec.ts
    

    【讨论】:

      【解决方案5】:

      你可以去src/test.ts,可以改下面这行:

      const context = require.context('./', true, /\.spec\.ts$/);

      const context = require.context('./', true, /**yourcomponent.component**\.spec\.ts$/);

      【讨论】:

      • 严格来说,这听起来是最正确的答案,尽管大多数关于如何做到这一点的问题都通过使用 fit 和 fdescribe 解决了问题。在 Karma 中有一个 git 问题可以更轻松地完成此操作:github.com/karma-runner/karma/issues/1507。理想情况下,虽然不简单,但我们可以配置 Karma,以便我们可以对一项测试进行更改,然后只需在浏览器中单击它以使用更新重新运行它。
      【解决方案6】:

      这可以通过include 选项来实现。 https://angular.io/cli/test#options

      这是一个全局匹配,例如:

      ng test --include='**/someFolder/*.spec.ts'
      

      我在8.1.0 release notes 中找不到它,但@Swoox 在下面提到这是cli 版本8.1.0 之后的一个功能。感谢您解决这个问题。

      【讨论】:

      • 这似乎是最近的更新。可能想要包含所需的版本。需要 CLI 8.1。
      • 似乎在 v9.1 中被移除 :(
      • 我刚刚在 CLI v9.1.0 中对此进行了测试,它运行良好。
      • 也可以在 CLI v10.0.4 中使用
      • 适用于 CLI v12
      【解决方案7】:

      Visual Studio 代码扩展

      最简单的方法是使用vscode-test-explorer 扩展及其子angular-karma-test-explorerjasmine-test-adapter,如果需要,您将获得当前测试的列表以逐个运行:

      这与我在this question 给出的答案相同,那里还有更多细节。

      【讨论】:

        【解决方案8】:

        你一定要去src/test.ts,可以把下面的行号代码改成18:

        //Then we find all the tests.
        const context = require.context('./', true, /\.spec\.ts$/);
        

        //Then we find all the tests.
        const context = require.context('./', true, /testing.component\.spec\.ts$/);
        

        【讨论】:

          【解决方案9】:

          我发现ng test 有一个附加选项--include,您可以使用它来对单个文件、特定目录或一堆文件运行测试:

          // one file
          npm run test -- --include src/app/components/component/component-name.component.spec.ts
          
          // directory or bunch of files
          npm run test -- --include src/app/components
          

          ng cli docs

          【讨论】:

          • Angular 9 - 它似乎已被删除
          • 不,它在 NG 9 中仍然可用。
          【解决方案10】:

          在 Angular 9 中,我很幸运:

          如果你想测试一个特定的文件:

          ng test --test-file=path/to/your/file.component.spec.ts
          

          如果您的 Angular 项目中有多个项目和/或正在使用 NX,您可以指定一个 Angular 项目进行测试:

          ng test project-name
          


          你也可以使用

          ng test --testNamePattern componentname
          

          类似path/to/your/component/componentname.spec.ts。这将扫描每个项目中的每个文件,并且速度较慢。


          如果您只想测试自上次提交以来发生的变化(使用 git 或其他版本控制)

          ng test --only-changed
          

          不适用于原版 Angular。

          【讨论】:

          • 我尝试使用 --only-changed 但它显示了一个无效选项,我已经浏览了 Angular 文档并且没有定义这样的选项。你能在它工作的地方添加一些虚拟项目吗?
          • --仅更改在 Angular cli 中不存在,请提供对 Angular 源和提供此功能的文档的参考
          • ng test -- --only-changed 对你们俩都有效吗?我们将 NX 用于我们的 Angular 单一存储库,它可能已经修改了 ng 命令。我们还在使用带有 Angular 的测试库,这可能也改变了一些事情。
          【解决方案11】:

          我一直在寻找答案。你的问题线程确实帮助了我很多。但是,有些地方是模棱两可的。特别是,如果您运行以下 CLI 命令。

          npm run test -- --include src/app/component/your.component.spec.ts
          

          它将运行单个测试文件,但运行测试后,测试浏览器将立即关闭,由于缺少 watch 标志,您无法观看您的测试文件。因此,您必须提供监视标志作为真值。我发现下面的 CLI 命令与 watch 标志一起工作正常。

          ng test --watch=true "--include" "src/app/components/your.component.spec.ts"
          

          【讨论】:

            【解决方案12】:

            如果您使用 IntelliJ IDE,您可以安装“Karma”插件并通过单击规范测试旁边的“运行”图标单独运行规范

            【讨论】:

              猜你喜欢
              • 2016-11-24
              • 2015-05-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-12-03
              • 2014-03-25
              • 1970-01-01
              相关资源
              最近更新 更多