你好,
我认为第 213 行的“json_formatter.js”中有一个错误,请参见下面的代码段:
if (status === _status2.default.FAILED && exception) {
data.result.error_message = exception.stack || exception;
}
任何失败的测试都将导致在 IMO 时记录堆栈跟踪,它至少应该是 exception.message,并且可能也是堆栈跟踪(如果您可以打开/关闭堆栈跟踪错误,那就太好了)。
有人可以确认这是否是错误以及如何解决。
我用 CucumberJS 运行 NightwatchJS,我的环境细节如下:
节点 - v8.7.0
黄瓜 - v3.03
守夜人 - v0.9.16
守夜黄瓜 - v8.2.2
浏览器 - Chrome v61.0.3163.100
Chrome 驱动程序 - v2.32
硒 - v3.5.3
操作系统 - Windows 7
我附上了一份 json 格式化程序输出的副本,显示了第 86 行的错误消息
问候,
内维尔·汉弗莱
没有其他人看到这个错误吗?
我认为这是一个错误。 json_formatter@213 中的代码行应该是:
data.result.error_message = exception.message + exception.stack;
并不是
data.result.error_message = exception.stack || exception;
这样你就会得到断言错误和堆栈跟踪。
我见过同样的问题,请有人确认这是一个错误吗?
根据我在 chrome 和 node 中的经验, Error: <message>
是堆栈的第一行。 Error: <message>
是error.toString()
。 我们可以使用类似的东西:
let msg = exception
if (exception.stack) {
msg = exception.stack
if (!_.includes(msg, error.toString()) {
msg = error.toString() + '\n' + msg
}
}
data.result.error_message = msg
可以确认堆栈不包含 safari 中的消息。 我在 chrome 61 和节点 8 的堆栈中看到了消息。
我在使用 nightwatch 黄瓜时遇到了同样的问题(失败通常会导致没有堆栈的错误消息)。 这对我来说是一个错误
let error_message = _.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;
如果堆栈中包含异常消息,则此解决方案可能会提供不重复的 error_message。 否则异常消息放在之前。
你好,
我们在同一行有类似的问题,但由于此元素的类型。
进入生成的json报告文件,error_message是一个字符串OR一个对象。 我们可以在这里保持一致性吗? 等待听听人们对此的看法。
我们的问题是当我们尝试从 json 生成 html 报告时。 目前,cucumber-html-reporter 库希望这个 error_message 是一个字符串。 当我们将其作为对象获取时,html 报告器失败。
更进一步,由于使用不同的浏览器库进行测试,我们得到了这种类型的差异。 每当我们使用 webdriverio 运行测试时,报告生成都会通过。 但是使用 webdriverjs-angular,report.json 会将 error_message 作为对象,因此在生成 html 报告时会失败。
根据您的回复,我可能需要在不同的地方提出这个问题,但我认为最好的起点是看看我们是否可以在 error_message 类型上保持一致性。
谢谢!
嗨finaruioana,
在您的本地版本的 cucumber/lib/formatter/json_formatter.js 中,您可以测试将第 213 行更改为以下内容是否适合您:
let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
error_message += exception.stack;
data.result.error_message = error_message || exception;
如果是这样,我可能会使用上述修复程序提交拉取请求,因为在此问题上似乎没有任何吸引力。
嗨@humphreyn
确实,进行上述更改解决了我的问题。 我还会在附加之前在堆栈上添加一个 if,在我的情况下是附加未定义。
javascript
let error_message = _lodash.includes(exception.stack, exception.message) ? '' : exception.message + '\n';
if (exception.stack) {
error_message += exception.stack;
}
data.result.error_message = error_message || exception;
谢谢!
我理所当然地认为异常是一个定义了消息和堆栈的对象,但如果情况并非总是如此,则需要进行小幅调整:
let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;
如果未定义消息或堆栈,此代码可防止将“未定义”添加到 error_message。 如果两者都未定义或为空字符串,则异常对象将分配给 error_message。 如果我们想强制使用字符串 error_message 我们可以使用JSON.stringify
:
let msg = exception.message || '';
let stack = exception.stack || '';
msg = _.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || JSON.stringify(exception);
@finaruioana您认为此解决方案没问题(要在本地环境中进行测试,您必须使用_lodash
而不是_
)
let msg = exception.message || '';
let stack = exception.stack || '';
msg = _lodash.includes(stack, msg) ? '' : (msg + '\n');
data.result.error_message = (msg + stack) || exception;
是的,看起来不错@innocentiv。 测试它,似乎工作正常。
@innocentiv ,我还可以确认这些更改在本地对我来说适用于 chrome,ie 和 firefox,并具有以下设置:
nodejs: v8.9.0
黄瓜js:v 3.1.0
守夜人黄瓜:v0.9.16
硒独立:v3.4.0
即网络驱动程序:v3.4.0
铬网络驱动程序:v2.33
gecko (firefox) 网络驱动程序:v0.19.1
您会提交拉取请求以应用此修复程序吗?
@humphreyn拉取请求:#973
我只是修改了拉取请求来检查字符串异常。 您可以使用以下方法在本地测试它:
if (_lodash2.default.isString(exception)) {
data.result.error_message = exception;
} else {
var _exception$message = exception.message,
message = _exception$message === undefined ? '' : _exception$message,
_exception$stack = exception.stack,
stack = _exception$stack === undefined ? '' : _exception$stack;
message = _lodash2.default.includes(stack, message) ? '' : message + '\n';
data.result.error_message = message + stack || JSON.stringify(exception);
}
由于关闭后没有任何近期活动,因此该线程已自动锁定。 请为相关错误打开一个新问题。
最有用的评论
嗨finaruioana,
在您的本地版本的 cucumber/lib/formatter/json_formatter.js 中,您可以测试将第 213 行更改为以下内容是否适合您:
如果是这样,我可能会使用上述修复程序提交拉取请求,因为在此问题上似乎没有任何吸引力。