我正在使用
karma
和 karma-typescript
(但这不是 Angular 项目,所以我没有使用 angular-cli
)。
大约一半的测试运行会在所有测试都通过之后产生错误,我对如何进行感到困惑。这是输出。
$ karma start karma.conf.js --single-run --jenkins
21 02 2019 09:43:38.104:INFO [compiler.karma-typescript]: Compiling project using Typescript 3.2.4
21 02 2019 09:43:53.795:INFO [compiler.karma-typescript]: Compiled 21 files in 15446 ms.
21 02 2019 09:43:57.633:INFO [bundler.karma-typescript]: Bundled imports for 21 file(s) in 3328 ms.
21 02 2019 09:43:59.695:INFO [karma-server]: Karma v4.0.0 server started at http://0.0.0.0:9876/
21 02 2019 09:43:59.720:INFO [launcher]: Launching browsers ChromeHeadless with concurrency unlimited
21 02 2019 09:43:59.757:INFO [launcher]: Starting browser ChromeHeadless
21 02 2019 09:44:01.220:INFO [HeadlessChrome 72.0.3626 (Windows 10.0.0)]: Connected on socket 16JL3Xy0xm-ri3aBAAAA with id 59122393
HeadlessChrome 72.0.3626 (Windows 10.0.0): Executed 0 of 110 SUCCESS (0 secs / 0 secs)
[1A[2KHeadlessChrome 72.0.3626 (Windows 10.0.0): Executed 1 of 110 SUCCESS (0 secs / 0.061 secs)
...
[1A[2KHeadlessChrome 72.0.3626 (Windows 10.0.0): Executed 110 of 110 SUCCESS (2.695 secs / 2.341 secs)
TOTAL: 110 SUCCESS
21 02 2019 09:44:05.251:ERROR [karma-server]: { Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:111:27) errno: 'ECONNRESET', code: 'ECONNRESET', syscall: 'read' }
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command
(
--jenkins
标志在我的 karma.conf.js
中主要用于确定是否使用 ChromeHeadless
而不是 Chrome
-- 见下文)。
我很确定这个错误不是来自我的代码。
相关配套:
"@types/jasmine": "^3.3.8",
"@types/jasminewd2": "^2.0.6",
"awesome-typescript-loader": "^5.2.1",
"jasmine": "^3.3.1",
"jasmine-core": "^3.3.0",
"karma": "^4.0.0",
"karma-chrome-launcher": "^2.2.0",
"karma-cli": "^2.0.0",
"karma-jasmine": "^2.0.1",
"karma-jasmine-html-reporter": "^1.4.0",
"karma-junit-reporter": "^1.2.0",
"karma-typescript": "^4.0.0",
"ts-loader": "^5.3.3",
"typescript": "^3.2.4"
最后,这是我的
karma.conf.js
:
module.exports = function(config) {
const jenkins = config.jenkins;
config.set({
basePath: '',
frameworks: ["jasmine", "karma-typescript"],
plugins: [
require('karma-jasmine'),
require("karma-chrome-launcher"),
require("karma-typescript"),
jenkins ? require('karma-junit-reporter') : require('karma-jasmine-html-reporter')
],
client:{
clearContext: false // leave Jasmine Spec Runner output visible in browser
},
files: [
"src/**/*.ts"
],
preprocessors: {
"src/**/*.ts": "karma-typescript"
},
reporters: [
'progress', (jenkins ? 'junit' : 'kjhtml'), 'karma-typescript'
],
browsers: [jenkins ? 'ChromeHeadless' : 'Chrome'],
karmaTypescriptConfig: {
tsconfig: "./tsconfig.json",
coverageOptions: {
exclude: [/mock/, /\.spec\.ts$/, /testing-utils/]
}
},
colors: !jenkins,
logLevel: config.LOG_INFO,
autoWatch: !jenkins,
singleRun: jenkins,
junitReporter: {
outputDir: 'karma-results',
outputFile: 'karma-results.xml'
}
});
};
抱歉,我无法帮助调试 karma-server 的一般错误。但是,如果有人遇到类似的错误消息,我可以根据我对这个错误的经验提供一些额外的见解。
我最近遇到了一个非常相似的错误(karma 6.3.4 和 jasmine 3.9.0):
04 01 2022 17:37:02.327:ERROR [karma-server]: UncaughtException: Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:209:20)
04 01 2022 17:37:02.328:ERROR [karma-server]: Error: read ECONNRESET
at TCP.onStreamRead (internal/stream_base_commons.js:209:20) {
errno: -4077,
code: 'ECONNRESET',
syscall: 'read'
}
遗憾的是,错误消息并未指向特定的单元测试。我确定我们的一些单元测试正在使用 WEBSOCKET 的提供程序:
{ provide: WEBSOCKET, useFactory: (): typeof WebSocket => WebSocket },
简单地更改这些以使用模拟提供程序而不是真正的 WebSocket 似乎已经解决了问题。类似的东西:
{ provide: WebSocketService, useClass: WebSocketServiceMock},
因为我们仍然有一些使用真正提供者的网络套接字似乎不会导致这个问题。我们也很有可能只需要确保在这些特定的单元测试期间正确关闭我们的网络套接字,而不是等待并让 Karma 处理我们的垃圾。
附带说明,在 Karma 存储库中有一个待定的 拉取请求 来隐藏此错误消息。然而,提交者似乎已经放弃了审查中建议的更改,因此可能需要很长时间才能将代码纳入母版。
来自related answer我使用javascript-karma-verbose-reporter插件来解决这个问题。
不同的答案/评论之间的设置似乎有很大差异。对我来说,在本地运行(不是在 Jenkins、Gulp 等),我运行
npm install --save-dev karma-verbose-reporter
通过安装这个,我当前版本的业力 (v4.4.1) 识别出有一个插件,我不需要使用
plugins
.的
karma.conf.js
部分
然后将
karma-verbose-reporter
添加到reporters
中的karma.conf.js
数组:
module.exports = function(config) {
config.set({
// reporters configuration
reporters: ['verbose']
});
};
这与您的问题的相关性是它提供的输出(不在相关答案中)。这是我输出的一部分,我使用的是屏幕截图,因为颜色非常有用:
您可以看到
ERROR
重复了两次。第二次整齐地绑定到出现错误的测试名称:
27 02 2023 11:52:08.143:ERROR [HeadlessChrome 110.0.5481 (Linux 0.0.0) | react-input-mask | should show empty value when input switches from uncontrolled to controlled]: 'Warning: A component is changing an uncontrolled input of type %s to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa). Decide between using a controlled or uncontrolled input element for the lifetime of the component. More info: https://reactjs.org/docs/forms.html#controlled-components%s', 'undefined', '
in input (created by InputMask)
in InputMask'