Javascript Mocha Async before()挂钩超时 背景
我正在Mocha测试中使用from Node.js创建一个虚拟服务器 我有一个虚拟测试,我想在测试开始之前启动服务器,然后在以下情况下终止它: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
"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;
});
});
问题
问题是我的asyncbefore
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)