angular - 如何让 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 中报告“不完整”状态
解决方案
如果您只需要为库运行测试,您可以使用ng test library-name
,就像您使用 build 命令生成 dist 文件一样。这里解释一下。
推荐阅读
- linux - Grep 获取三个日志文件中的文本
- javascript - d3.range.map 有什么作用?
- amazon-web-services - Terraform:获取给定 vpc 的 AWS 子网 ID 失败,没有结果
- flutter - Flutter:当按下相同的选项卡时,抽屉小部件刷新页面
- ruby-on-rails - 如何获取ROR中连接其他表的数据
- django - 如何使用 ajax 在 django 视图中获取已检查的对象?
- java - 主机和主机内部的 Jmeter API 自动化
- typescript - Angular innerHtml 中的插值
- pyspark - 合并两个蜂巢表(不同的列大小)- pyspark
- azure - Azure SQL 数据库存储错误,它显示了很多未分配的错误