Travis CI节点构建随机失败



我在一个节点模块上遇到问题,所有测试都在该模块上本地工作,在其他盒子上和Travis CI上都有问题,但有时,并非由于超时,Travis Cl上的一个测试失败。至少在我看来,这个测试是确定的,所以它不应该随机失败。

我已将问题追溯到以下部分:

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(再次仅有时),因此函数输出字符串,而不是测试正确失败的对象。标志评估失败的证据可以在这个构建中看到,它转储字符串而不是对象(我还有一个测试来确保无论何时指定output_objects,返回的值都是对象,并且它也失败了,显示了string,而object是预期的)。

根据我的说法,这不应该发生,output_objects的定义也不是模棱两可的,当然也不是随机的。然而,这正是一次又一次发生的事情。

我做错了什么?

问题出现在一个单元测试中,该测试在完成自身之前没有等待异步调用完成。这会干扰其他测试的执行,具体取决于时间。这对于有问题的节点模块(nock)来说是非常具体的,因为它模拟HTTP/HTTPS请求,因此后续测试有时会捕获故障测试中的异步请求。

最新更新