我在一个节点模块上遇到问题,所有测试都在该模块上本地工作,在其他盒子上和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请求,因此后续测试有时会捕获故障测试中的异步请求。