web-dev-qa-db-ja.com

テスト後にモカが終了しない

Nodeでのテストから始めています。 mocha、chai、およびnockの使用(外部HTTP API呼び出しをインターセプトするため)。

3つのテストを作成しましたが、すべてが合格です。ただし、3番目のテストを追加すると、テストの実行後にmochaが終了し、エラーもエラーも表示されませんでした。

3番目のテストにコメントすると、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)は、他の2つのテストでも呼び出されます。これらのテストは、実行されるとmochaが正常に終了します。

何がこれを引き起こしているのでしょうか?

モカバージョン:5.1.1

14
Fede E.

これに答えるのは少し遅れていることは知っていますが、同様の問題に直面していて、あなたの投稿を見ました。

Mocha 4.0.0では、ファイナライズ時のテストの動作が変更されました。 here から:

テストが「完了」したように見えてもmochaプロセスがまだ生きている場合、テストは何かが(非同期的に)スケジュールされており、適切にクリーンアップされていません。ソケットを開いたままにしましたか?

あなたの場合、createReadStream()への呼び出しは決して閉じられなかったようです。

したがって、2つのオプションがあります。

オプションA:fsおよびその他のストリームを閉じます(推奨)

オプションB:--exitオプション。

27
Alex Mantaut