我遇到一个node module的问题,其中所有测试都在本地,其他框和Travis-CI上运行但有时候,并且由于超时而导致Travis-CI上单个测试失败。测试是确定性的,至少根据我的说法,所以它不应该随机失败。
我已将问题追溯到这一部分:
function record(rec_options) {
// Originaly the parameter was a dont_print boolean flag.
// To keep the existing code compatible we take that case into account.
var typeof_rec_options = typeof(rec_options);
var dont_print = (typeof_rec_options === 'boolean' && rec_options)
|| (typeof_rec_options === 'object' && rec_options.dont_print);
var output_objects = typeof_rec_options === 'object' && rec_options.output_objects;
...
var out = !output_objects ?
generateRequestAndResponse(body, options, res, datas) :
generateRequestAndResponseObject(body, options, res, datas);
对于rec_options
{ dont_print: true, output_objects: true }
的值,var output_objects
被评估(再次仅有时)为false
,因此函数输出字符串和不是正确的测试失败的对象。标记评估失败的证据可以在this build中看到,它转储出字符串而不是对象(我也有一个测试,以确保只要指定了output_objects
,返回的值就是一个对象,并且失败为很好地展示string
预计object
的位置。
根据我的说法,这绝不应该发生,并且output_objects
没有明确定义,当然也不是随机定义的。然而,这正是一次又一次发生的事情。
我做错了什么?
答案 0 :(得分:1)
问题在于其中一个单元测试没有等待其异步调用完成之前完成自身。然后,这将根据时间干扰执行其他测试。这非常特定于所讨论的节点模块(nock),因为它模拟了HTTP / HTTPS请求,因此后续测试有时会捕获来自错误测试的异步请求。