如何只使用angular-cli执行一个测试规范

Zie*_*elu 89 jasmine angular-cli angular

我使用Angular-CLI(beta 20)构建了Angular2项目.

有没有办法只针对一个选定的spec文件运行测试?

我曾经有一个基于Angular2快速启动的项目,我可以手动将规范添加到jasmine文件中.但是我不知道如何在业力测试之外设置它,或者如何使用Angular-CLI构建将业力测试限制为特定文件.

Tom*_*ski 168

您的每个.spec.ts文件都将其所有测试分组在describe块中,如下所示:

describe('SomeComponent', () => {...}

您可以通过在describe函数名前加上f以下内容来轻松运行此单个块:

fdescribe('SomeComponent', () => {...}

如果您有这样的功能,则不会describe运行其他块.顺便说一句.你可以用it=> 做类似的事情,fit还有一个"黑名单"版本 - x.所以:

  • fdescribe并且fit导致以这种方式标记的功能运行
  • xdescribexit导致以这种方式标记的所有函数运行

  • 我认为虽然OP接受了这个答案,但问题实际上是如何只评估一个规范文件:P (5认同)
  • 我在 helloworld.component.spec.ts 文件中使用了 fdescribe,但也显示了 app.component.spec.ts 文件的错误。 (3认同)
  • 那是因为正在评估所有代码(否则它不会知道您的测试中有 fdescribes) - fdescribe 仅限制测试结果的执行。您仍然需要修复其他文件中的语法/打字稿错误。 (2认同)
  • 这不是答案。@iislucas有下面的答案。 (2认同)

小智 62

test.tssrc文件夹内配置文件:

const context = require.context('./', true, /\.spec\.ts$/);
Run Code Online (Sandbox Code Playgroud)

替换/\.spec\.ts$/为您要测试的文件名.例如:/app.component\.spec\.ts$/

这将仅运行测试app.component.spec.ts.

  • 应该接受答案,这种方法在日志中消除了一大堆gumpfy输出 - 不像fdescribe那么冗长 (6认同)
  • 轻松解决方案:)节省了大量时间. (3认同)
  • 更新到 Angular 15 后它停止工作。知道为什么吗?```typescript const context = require.context('./', true, /\.spec\.ts$/); ``` 运行测试命令后出现此错误 - ```shell An error was returned in afterAll Uncaught TypeError: __webpack_require__(...).context is not a function TypeError: __webpack_require__(...).context is not一个函数``` (2认同)

Pet*_*erB 36

这在每种情况下都对我有用:

ng test --include='**/dealer.service.spec.ts'
Run Code Online (Sandbox Code Playgroud)

但是,我通常会为此收到“TypeError:无法读取 null 的属性 'ngModule'”:

ng test --main src/app/services/dealer.service.spec.ts
Run Code Online (Sandbox Code Playgroud)

@angular/cli 10.0.4 的版本

  • 仅供参考:甚至可以使用更复杂的通配符。无论如何,请确保您解决了“*.spec.ts”问题。例如,要仅运行共享文件夹的测试或在 src/app 内搜索,请使用 `ng test --include='src/app/{shared,search}/*.spec.ts'`。 (2认同)

aln*_*sre 28

使用--include

它与--include

ng test --include src/app/path-to-component/path-component.component.spec.ts
Run Code Online (Sandbox Code Playgroud)

我尝试过--main,但它显示了所有失败的结果,而事实并非如此。我想--main会改变主test.ts文件。


iis*_*cas 24

您可以使用Angular CLIng命令)仅测试特定文件,如下所示:

ng test --main ./path/to/test.ts
Run Code Online (Sandbox Code Playgroud)

更多文档位于https://angular.io/cli/test

请注意,虽然这适用于独立库文件,但不适用于有角度的组件/服务/等。这是因为有角度的文件依赖于其他文件(即src/test.ts在Angular 7中)。遗憾的是,该--main标志没有多个参数。

  • 对于 Angular 9,我得到未知选项“--main”:( (5认同)
  • 这是一个很好的建议,而且很有效。谢谢!此外值得一提的是,如果我们尝试将其指向自动生成的 `component.spec.ts` 文件,我们将看到测试永远不会开始:`Error: AsyncTestZoneSpec is needed for the async() test helper但找不到。请确保您的环境包含 zone.js/dist/async-test.js` ...我确定可以一起破解进一步的解决方法,但这是需要注意的,因为在 `src/main.js 中完成设置。 ts` 及其导入在这种情况下不可用。 (2认同)
  • 这个答案也适用于 Angular 8。这应该是可接受的答案,因为它将只运行一个测试规范文件。 (2认同)
  • 与 @pulkitsinghal `Error: AsyncTestZoneSpec is required for the async()` 有同样的问题,但在命令中通过 `--include` 更改 `--main` 解决了错误并仅执行了该测试。 (2认同)

小智 7

执行此操作的一个简单方法是使用f启动描述及其所有内容

fdescribe('testecomponente', () => {
  fit('should create', () => {
    //your code 
  }
  
}
  
Run Code Online (Sandbox Code Playgroud)


6EQ*_*UJ5 6

如果您希望能够控制从命令行中选择了哪些文件,我设法对Angular 7进行了此操作。

总之,您需要安装@angular-devkit/build-angular:browser然后创建自定义Webpack插件以通过测试文件regex。例如:

angular.json-从更改测试生成器@angular-devkit/build-angular:browser并设置自定义配置文件:

...

        "test": {
          "builder": "@angular-builders/custom-webpack:browser",
          "options": {
            "customWebpackConfig": {
              "path": "./extra-webpack.config.js"
            },
...
Run Code Online (Sandbox Code Playgroud)

extra-webpack.config.js-创建一个从命令行读取正则表达式的webpack配置:

const webpack = require('webpack');
const FILTER = process.env.KARMA_FILTER;
let KARMA_SPEC_FILTER = '/.spec.ts$/';
if (FILTER) {
  KARMA_SPEC_FILTER = `/${FILTER}.spec.ts$/`;
}
module.exports = {
  plugins: [new webpack.DefinePlugin({KARMA_SPEC_FILTER})]
}
Run Code Online (Sandbox Code Playgroud)

test.ts-编辑规格

...
// Then we find all the tests.
declare const KARMA_CONTEXT_SPEC: any;
const context = require.context('./', true, KARMA_CONTEXT_SPEC);
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令覆盖默认值:

KARMA_FILTER='somefile-.*\.spec\.ts$' npm run test
Run Code Online (Sandbox Code Playgroud)

我在这里记录了背景故事,对于类型和错误链接,我们事先表示歉意。感谢@ Aish-Anu的上述回答,指出了我的正确方向。


use*_*418 5

这在 Angular 7 中对我有用。它基于 ng 命令的 --main 选项。我不确定这个选项是否没有记录并且可能会发生变化,但它对我有用。我在 script 部分的 package.json 文件中添加了一行。使用 ng test 命令的 --main 选项,我指定要执行的 .spec.ts 文件的路径。例如

"test 1": "ng test --main E:/WebRxAngularClient/src/app/test/shared/my-date-utils.spec.ts",
Run Code Online (Sandbox Code Playgroud)

您可以像运行任何此类脚本一样运行该脚本。我通过单击 npm 部分中的“test 1”在 Webstorm 中运行它。


小智 5

在 bash 终端中,我喜欢使用双破折号。使用 VS Code,您可以在资源管理器或打开的选项卡上右键单击规范文件。然后选择“复制相对路径”。运行下面的命令,从剪贴板粘贴相对路径。

npm t -- --include relative/path/to/file.spec.ts
Run Code Online (Sandbox Code Playgroud)

双破折号表示您的命令选项的结束npm t并将之后的任何内容传递给指向 的下一个命令ng t。它不需要任何修改,并迅速给出所需的结果。