[英]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
永遠不會被調用,因此鈎子超時了。
我嘗試增加超時時間,認為可以解決此問題,但無濟於事。
如何修復我的代碼?
您的代碼有兩個問題:
您需要在dummyReader.server.listen(...);
翻轉主機地址和端口參數dummyReader.server.listen(...);
。 端口排在第一位,主機排在第二位。
直到真正連接到服務器,才調用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.