簡體   English   中英

Mocha Async before()掛鈎超時

[英]Mocha Async before() hook timing out

背景

我正在Mocha測試中使用來自Node.js的net創建虛擬服務器。

我有一個虛擬測試,我想在測試開始之前啟動服務器,並在測試結束后將其殺死:

"use strict";

/*global describe, it, expect, before, after*/

const net = require("net");

describe("dummy server test", () => {

    const dummyReader = {
        IP: "localhost",
        port: 4002,
        server: undefined,
        socket: undefined
    };

    before("Starts dummy server", done => {

        dummyReader.server = net.createServer(socket => {
            dummyReader.socket = socket;
            done();
        });

        dummyReader.server.listen(dummyReader.IP, dummyReader.port);

    });

    after("Kills dummy server", done => {
        dummyReader.server.close();
        dummyReader.socket.destroy();
        done();
    });

    it("should pass", () => {
        expect(true).to.be.true;
    });
});

問題

問題是我的鈎子異步before從未完成。 由於某種原因,我無法理解done永遠不會被調用,因此鈎子超時了。

我嘗試增加超時時間,認為可以解決此問題,但無濟於事。

如何修復我的代碼?

您的代碼有兩個問題:

  1. 您需要在dummyReader.server.listen(...);翻轉主機地址和端口參數dummyReader.server.listen(...); 端口排在第一位,主機排在第二位。

  2. 直到真正連接到服務器,才調用net.createServer的回調,但是您沒有任何連接。

before鈎子before使用以下代碼將運行代碼。 我添加了代碼,該代碼可立即創建連接以用於說明目的。

before("Starts dummy server", done => {

    dummyReader.server = net.createServer(socket => {
        dummyReader.socket = socket;
        done();
    });

    dummyReader.server.listen(dummyReader.port,
                              dummyReader.IP,
                              undefined,
                              () => {
                                  // For illustration purposes,
                                  // create a connection as soon
                                  // as the server is listening.
                                  net.connect(
                                      dummyReader.port,
                                      dummyReader.IP);
                              });
});

盡管在我看來,您應該做的是在服務器偵聽后立即終止before鈎子,然后在測試中將其連接。 這是如何完成此操作的說明:

"use strict";

/*global describe, it, expect, before, after*/

const net = require("net");

describe("dummy server test", () => {

    const dummyReader = {
        IP: "localhost",
        port: 6002,
        server: undefined,
        socket: undefined
    };

    before("Starts dummy server", done => {
        dummyReader.server = net.createServer(socket => {
            console.log("got a new socket!");
            dummyReader.socket = socket;
        });

        dummyReader.server.listen(dummyReader.port,
                                  dummyReader.IP,
                                  undefined,
                                  () => {
                                      done();
                                  });
    });

    after("Kills dummy server", done => {
        dummyReader.server.close();
        // dummyReader.socket.destroy();
        done();
    });

    let prevSocket;
    it("should pass", (done) => {
        net.connect(dummyReader.port, dummyReader.IP, () => {
            console.log(dummyReader.socket.address());
            prevSocket = dummyReader.socket;
            done();
        });
    });

    it("should pass 2", (done) => {
        net.connect(dummyReader.port, dummyReader.IP, () => {
            console.log(dummyReader.socket.address());
            console.log("same socket?",
                        prevSocket === dummyReader.socket);
            done();
        });
    });
});

每次連接時,都會創建一個新的net.Socket對象並將其分配給dummyReader.socket ,因此您可以在需要時從內部訪問它。 我在代碼中添加了console.log語句,以顯示一些關鍵值。 當我在這里運行它時,我得到:

  dummy server test
got a new socket!
{ address: '127.0.0.1', family: 'IPv4', port: 6002 }
    ✓ should pass
got a new socket!
{ address: '127.0.0.1', family: 'IPv4', port: 6002 }
same socket? false
    ✓ should pass 2


  2 passing (71ms)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM