I am using Jest and mongo-memory-server to test my code. I try to do some tests then I received an error message (UnexpectedCloseError: Instance closed unexpectedly with code "48" and signal "null") but when I select “run just failed tests” mode, all of them passed. Here is the code and error message;
Error
PASS src/test/health.test.ts
FAIL src/test/user.test.ts
● Console
console.warn
Starting the MongoMemoryServer Instance failed, enable debug log for more information. Error:
UnexpectedCloseError: Instance closed unexpectedly with code "48" and signal "null"
at MongoInstance.closeHandler (/Users/ertan/Desktop/jsarticles/jsad-backend/node_modules/mongodb-memory-server-core/src/util/MongoInstance.ts:546:52)
at ChildProcess.emit (node:events:520:28)
at maybeClose (node:internal/child_process:1092:16)
at Process.ChildProcess._handle.onexit (node:internal/child_process:302:5)
at MongoMemoryServer.<anonymous> (node_modules/mongodb-memory-server-core/src/MongoMemoryServer.ts:293:17)
at node_modules/mongodb-memory-server-core/node_modules/tslib/tslib.js:169:75
at __awaiter (node_modules/mongodb-memory-server-core/node_modules/tslib/tslib.js:165:16)
at node_modules/mongodb-memory-server-core/src/MongoMemoryServer.ts:284:68
● User Models › should insert a doc into user collection
Instance closed unexpectedly with code "48" and signal "null"
at MongoInstance.closeHandler (node_modules/mongodb-memory-server-core/src/util/MongoInstance.ts:546:52)
● User Models › should find all users
Instance closed unexpectedly with code "48" and signal "null"
at MongoInstance.closeHandler (node_modules/mongodb-memory-server-core/src/util/MongoInstance.ts:546:52)
● User Models › should find user by email
Instance closed unexpectedly with code "48" and signal "null"
src/test/employee.test.ts
import {
afterAll,
afterEach,
beforeAll,
describe,
it,
jest,
expect,
} from "@jest/globals";
import {
connectDB,
dropCollections,
dropDB,
} from "../configs/mongoMemoryServer";
import {
UserModel,
createUser,
deleteUserById,
findUserByEmail,
findUserById,
findUsers,
} from "../model/user";
jest.useRealTimers();
describe("User Models", () => {
beforeAll(async () => {
await connectDB();
});
afterAll(async () => {
await dropDB();
});
afterEach(async () => {
await dropCollections();
});
it("should insert a doc into user collection", async () => {
const MOCK_USER = {
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.1",
},
};
const createdUser = await createUser(MOCK_USER.email, MOCK_USER.gdprInfo);
expect(createdUser.email).toBe(MOCK_USER.email);
expect(createdUser.gdprInfo.ip).toBe(MOCK_USER.gdprInfo.ip);
expect(createdUser.gdprInfo.isAccepted).toBe(MOCK_USER.gdprInfo.isAccepted);
expect(createdUser.sentNewsletters).toEqual([]);
expect(createdUser.createdAt).toBeInstanceOf(Date);
expect(createdUser.updatedAt).toBeInstanceOf(Date);
});
it("should find all users", async () => {
const MOCK_USERS = [
{
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.1",
},
},
{
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.2",
},
},
];
await createUser(MOCK_USERS[0].email, MOCK_USERS[0].gdprInfo);
await createUser(MOCK_USERS[1].email, MOCK_USERS[1].gdprInfo);
const users = await findUsers([]);
expect(users).toBeDefined();
expect(users.length).toBeGreaterThan(0);
users.forEach((user) => {
expect(user).toBeInstanceOf(UserModel);
});
});
it("should find user by email", async () => {
const MOCK_USERS = [
{
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.1",
},
},
{
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.2",
},
},
];
await createUser(MOCK_USERS[0].email, MOCK_USERS[0].gdprInfo);
await createUser(MOCK_USERS[1].email, MOCK_USERS[1].gdprInfo);
const user = await findUserByEmail("[email protected]");
expect(user).toBeDefined();
expect(user).toBeInstanceOf(UserModel);
expect(user?.email).toBe("[email protected]");
expect(user?.email).not.toBe("[email protected]");
});
it("should find user by id", async () => {
const MOCK_USER = {
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.1",
},
};
const createdUser = await createUser(MOCK_USER.email, MOCK_USER.gdprInfo);
const user = await findUserById(createdUser?._id?.toString() || "");
expect(user).toBeDefined();
expect(user).toBeInstanceOf(UserModel);
expect(user?.email).toBe("[email protected]");
});
it("should delete user", async () => {
const MOCK_USER = {
email: "[email protected]",
gdprInfo: {
isAccepted: true,
ip: "111.111.1.1",
},
};
const createdUser = await createUser(MOCK_USER.email, MOCK_USER.gdprInfo);
const deletedUser = await deleteUserById(
createdUser?._id?.toString() || ""
);
expect(deletedUser).toBeDefined();
expect(deletedUser).toBeInstanceOf(UserModel);
expect(deletedUser?._id).toEqual(createdUser._id);
});
});
configs/mongoMemoryServer
import { MongoMemoryServer } from "mongodb-memory-server";
import mongoose, { ConnectOptions } from "mongoose";
let mongo: MongoMemoryServer;
const connectDB = async () => {
mongo = await MongoMemoryServer.create({
instance: {
port: Number(process.env.DB_PORT),
},
});
const uri = mongo.getUri();
await mongoose.connect(uri, {
useNewUrlParser: true,
useUnifiedTopology: true,
} as ConnectOptions);
};
const dropDB = async () => {
if (mongo) {
await mongoose.connection.dropDatabase();
await mongoose.connection.close();
await mongo.stop();
}
};
const dropCollections = async () => {
if (mongo) {
const collections = await mongoose.connection.db.collections();
for (const collection of collections) {
await collection.drop();
}
}
};
export { connectDB, dropDB, dropCollections };
Versions
- NodeJS: v16.14.0
- mongodb-memory-server-*: ^8.13.0
- mongoose: ^7.2.2
- Jest ^29.5.0
- system: MacOS M1