首页 > 解决方案 > 如何让 Karma 在工作空间内运行特定 Angular 6 组件库的测试

问题描述

我有一个 Angular 6 工作区(称为 miami-space),并创建了一个名为“vice-lib”的组件库。此目录树如下所示:

.
└── miami-space       <-- This is my workspace directory
    ├── e2e
    │   └── src
    ├── node_modules
    ...
    ├── projects      <-- Projects directory for created libraries
    │   └── vice-lib
    │       └── src
    │           └── lib
    └── src           <-- The source directory for the app
        ├── app
        ├── assets
        └── environments

(我用 ng new library Vice-lib --ext=vlib 创建了这个库)

如果我去根目录(迈阿密空间)并运行单元测试

npm 运行测试

Karma 在浏览器中运行测试,但是因为有应用程序测试和库测试,所以 karma 分两个阶段运行测试。

第一阶段运行应用程序的测试,您会在控制台中看到:

λ ~/dev/tasks/t-122/cat/miami-space/ npm run test

> miami-fake-app@0.0.0 test /Users/Plastikfan/dev/tasks/t-122/cat/miami-space
> ng test

 10% building modules 1/1 modules 0 active(node:41963) DeprecationWarning: Tapable.plugin is deprecated. Use new API on `.hooks` instead
21 06 2018 13:47:36.106:WARN [karma]: No captured browser, open http://localhost:9876/
21 06 2018 13:47:36.111:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
21 06 2018 13:47:36.111:INFO [launcher]: Launching browser Chrome with unlimited concurrency
21 06 2018 13:47:36.116:INFO [launcher]: Starting browser Chrome
21 06 2018 13:47:39.894:WARN [karma]: No captured browser, open http://localhost:9876/    
21 06 2018 13:47:40.006:INFO [Chrome 67.0.3396 (Mac OS X 10.13.4)]: Connected on socket _5z2mq2NuMiHHahdAAAA with id 8795036
Chrome 67.0.3396 (Mac OS X 10.13.4): Executed 3 of 3 SUCCESS (0.154 secs / 0.138 secs)

...并且应用程序的测试结果显示在浏览器中

如果你点击 < CTRL >-C,Karma 会杀死浏览器,然后只运行库的测试(注意当我点击 CTRL-C 时的 ^C 表示):

^C  0% compiling21 06 2018 13:50:21.034:WARN [karma]: No captured browser, open http://localhost:9876/
21 06 2018 13:50:21.035:INFO [karma]: Karma v1.7.1 server started at http://0.0.0.0:9876/
21 06 2018 13:50:21.035:INFO [launcher]: Launching browser Chrome with unlimited concurrency
21 06 2018 13:50:21.044:INFO [launcher]: Starting browser Chrome
21 06 2018 13:50:24.453:WARN [karma]: No captured browser, open http://localhost:9876/  
21 06 2018 13:50:24.544:INFO [Chrome 67.0.3396 (Mac OS X 10.13.4)]: Connected on socket FelqTteskkryAtnYAAAB with id 63644171
Chrome 67.0.3396 (Mac OS X 10.13.4): Executed 5 of 5 SUCCESS (0.112 secs / 0.093 secs)

所以我真的不明白 Karma 是如何在这里运行的,假设这是预期的行为。

是否只允许在运行应用程序测试后对组件库运行测试?如果我在应用程序中有很多测试但我只想运行库测试怎么办?

如果我“cd”到 Vice-lib 目录并尝试使用 npm run test 运行测试,那么因为 package.json 是一个不包含脚本部分的缩减配置,所以 npm 失败是可以理解的:

echo '错误:没有指定测试'

所以我进一步阅读了业力文档并看到了“basePath”(默认设置为空字符串)。这被描述为:

将用于解析文件中定义的所有相对路径并排除的根路径位置。如果basePath配置是相对路径,那么会解析到配置文件的__dirname。

我想我可以更新它以指向库的根目录(希望可以选择在命令行上指定,这样我就可以编写多个脚本条目,请参见下文),即

./src/projects/vice-lib

但这似乎对 Karma 的行为没有影响,并且再次运行两组测试,需要 CTRL-C 才能进入运行库测试的第二阶段。这似乎是一个非常繁琐的工作流程,我希望有办法解决这个问题,所以我可以直接运行库测试。

假设我在工作区中插入了另一个库,所以现在有 2 个组件库和一个应用程序。这是否意味着我必须首先运行应用程序测试,然后是副库测试,然后是新库测试?我想你可以看到我要做什么,它似乎并不正确,除非我做错了什么(很可能!)。

我有一个默认的 test.ts 文件,它与包含该行(用于查找要运行的测试用例)的默认值相同:

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

但我不确定如何在每个库级别上更改它。

我希望我可以在 package.json: 脚本中定义多个条目,例如:

"test:app": "ng test",
"test:vice": "ng test --<some option to refer to .projects/vice-lib>"

这样我就可以直接为我想要的库运行测试。

那么 Karma 是如何在这里运行的,它是不是设计用于在工作区中处理多个项目?

更新:我还尝试在其中一个副库测试装置上使用fdescribe,但这除了控制台上的警告外没有任何效果:

Chrome 67.0.3396 (Mac OS X 10.13.4) 错误:“弃用:fit 和 fdescribe 将导致您的套件在 Jasmine 3.0 中报告“不完整”状态

标签: angularunit-testingkarma-runner

解决方案


如果您只需要为库运行测试,您可以使用ng test library-name,就像您使用 build 命令生成 dist 文件一样。这里解释一下。


推荐阅读