摩卡在测试后没有退出

Posted

技术标签:

【中文标题】摩卡在测试后没有退出【英文标题】:Mocha not exiting after test 【发布时间】:2018-10-26 15:00:24 【问题描述】:

我从 Node.js 中的测试开始。使用 mocha、chai 和 nock(拦截外部 HTTP api 调用)。

我写了 3 个测试,都通过了,但是,当我添加第 3 个测试时,运行测试后 mocha 停止退出,没有错误或任何错误指示。

如果我评论第三个测试,mocha 退出就好了。

这是导致“问题”的测试:

describe('tokenizer.processFile(req, \'tokenize\')', () => 

    it('should tokenize a file', async () => 

        req = 
            file: 
                originalname: 'randomcards.txt',
                buffer: cardsFile_buffer
            ,
            user: 
                displayName: user
            
        ;

        expect(Buffer.from(await tokenizer.processFile(req, 'tokenize'))).to.deep.equal(tokensFile_buffer);

    );

);

再次,该测试是通过,这让我感到困惑。

tokenizer.processFile的代码如下:

processFile: function(req, whatTo)

        combinedLogger.info(`Request to $whatTo $req.file.originalname received. Made by: $req.user.displayName`);

        return new Promise(function(resolve, reject)

            const lines = [], responses = [];

            const lineReader = require('readline').createInterface(
                input: require('streamifier').createReadStream(req.file.buffer)
            );

            lineReader.on('line', line => 
                lines.push(line);
            );

            lineReader.on('close', async () => 

                //process every line sequentially

                try 

                    //ensure DB connected to mass insert
                    await db_instance.get_pool();

                    for(const line of lines) 
                        var response;
                        req.current_value = line;
                        if (whatTo == 'tokenize')

                            response = await Tokenize(line);
                            db_instance.insertAction(req, 'tokenize', response);
                        
                        else if (whatTo == 'detokenize')
                            combinedLogger.info(`Request to detokenize $line received. Made by: $req.user.displayName`);
                            response = await Detokenize(line);
                            db_instance.insertAction(req, 'detokenize', line);
                        
                        responses.push(response);
                    

                    resolve(responses.join("\r\n"));

                
                catch(error)
                    reject(error);
                
            );

        );

    

另外两个测试也调用了函数 Tokenize(value) 和 Detokenize(value),运行时,mocha 退出就好了。

知道是什么原因造成的吗?

摩卡版本:5.1.1

【问题讨论】:

【参考方案1】:

我知道现在回答这个问题有点晚了,但我遇到了类似的问题并看到了你的帖子。

在 mocha 4.0.0 中,他们改变了关于终结的测试行为。来自here:

如果在您的测试看起来“完成”之后 mocha 进程仍然存在,那么您的测试已经安排了一些事情发生(异步)并且没有正确清理自己。你有没有打开一个套接字?

在您的情况下,对createReadStream() 的调用似乎从未关闭。

所以,你有两个选择:

选项 A:关闭 fs 和其他打开的流(推荐)

选项 B: 使用 --exit 选项运行 mocha。

【讨论】:

我正要说,你的测试中的 --exit 选项就是这样! 这种行为真的很有帮助,我不建议强制你的测试退出。通常当 mocha 挂起并且不会退出时,您的代码中有一些东西需要清理。最好能找到问题。我通过这种方式发现了很多潜在的漏洞。 这救了我的命! 我使用npmjs.com/package/why-is-node-running 找出我的节点应用程序仍在运行的原因。 不要强制关闭或阻止此行为。就我而言,MongoDB 驱动程序保持打开状态,最终保持测试运行,就像提到的 @reads0520 一样。

以上是关于摩卡在测试后没有退出的主要内容,如果未能解决你的问题,请参考以下文章

测试运行完成后一秒钟 Jest 没有退出(没有猫鼬)

测试运行完成后一秒钟,Jest 没有退出。 --detectOpenHandles

EarlGrey 故障 - “退出第一响应者状态后键盘没有消失”

在命令行上完成机器人测试后如何获取退出代码或退出状态

即使在应用退出后,如何使用 UIAutomation 工具继续测试 iOS 应用?

Xcode 测试后不退出