【问题标题】:How to get Karma to run tests of a specific angular 6 component library inside workspace如何让 Karma 在工作区中运行特定 Angular 6 组件库的测试
【发布时间】:2018-06-21 13:24:25
【问题描述】:

我有一个 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 创建了这个库)

如果我转到根目录(miami-space)并运行单元测试

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) 错误: 'DEPRECATION: fit and fdescribe 将导致您的套件在 茉莉花3.0'

【问题讨论】:

    标签: angular unit-testing karma-runner


    【解决方案1】:

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

    【讨论】:

    • 如果您只想运行库中的测试(例如,如果您的应用只是库的演示并且没有测试),则可以选择删除“测试”部分从应用程序,但保留一个库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多