Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/459.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Mocha Async before()挂钩超时 背景_Javascript_Node.js_Testing_Asynchronous_Mocha.js - Fatal编程技术网

Javascript Mocha Async before()挂钩超时 背景

Javascript Mocha Async before()挂钩超时 背景,javascript,node.js,testing,asynchronous,mocha.js,Javascript,Node.js,Testing,Asynchronous,Mocha.js,我正在Mocha测试中使用from Node.js创建一个虚拟服务器 我有一个虚拟测试,我想在测试开始之前启动服务器,然后在以下情况下终止它: "use strict"; /*global describe, it, expect, before, after*/ const net = require("net"); describe("dummy server test", () => { const dummyReader = { IP: "local

我正在Mocha测试中使用from Node.js创建一个虚拟服务器

我有一个虚拟测试,我想在测试开始之前启动服务器,然后在以下情况下终止它:

"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;
    });
});
问题 问题是我的async
before
hook永远不会完成。由于某种原因,我无法理解
done
从未被调用,因此挂钩超时

我试图增加暂停时间,相信这可以解决问题,但没有效果

问题:
如何修复代码?

您的代码有两个问题:

  • 您需要翻转
    dummyReader.server.listen(…)中的主机地址和端口参数。端口位于第一位,主机位于第二位

  • 直到有东西实际连接到服务器,才会调用对
    net.createServer
    的回调,但您没有任何东西连接到它

  • 使用以下
    之前的
    钩子,代码将运行。为了便于说明,我添加了立即创建连接的代码

    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);
                                  });
    });
    
    在我看来,您应该做的是在服务器侦听后立即在
    之前结束
    钩子,然后在测试中连接到它。以下是如何实现的示例:

    "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)
    

    您的代码有两个问题:

  • 您需要翻转
    dummyReader.server.listen(…)中的主机地址和端口参数。端口位于第一位,主机位于第二位

  • 直到有东西实际连接到服务器,才会调用对
    net.createServer
    的回调,但您没有任何东西连接到它

  • 使用以下
    之前的
    钩子,代码将运行。为了便于说明,我添加了立即创建连接的代码

    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);
                                  });
    });
    
    在我看来,您应该做的是在服务器侦听后立即在
    之前结束
    钩子,然后在测试中连接到它。以下是如何实现的示例:

    "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)
    

    非常完整的帖子!谢谢下次当我遇到类似的问题时,我一定会记得你(这可能比你想的要快:P)非常完整的帖子!谢谢下次我遇到类似问题时,我一定会记得你(这可能比你想的要快:P)