1

Im testing some functions with MongoDB and Mongoose. For the tests i'm using Jest and mongo-memory-server. The function createUser(arg1, arg2) should throw a TypeError if there already exists a user with that discord id in the database.

createUser(arg1, arg2)

async function createUser(disc_id, moodleToken) { const profileData = await fetchUser(disc_id); if (profileData) { throw TypeError("The account already exist in the database!"); } const newUser = new profileModel({ discord_id: disc_id, moodle_token: moodleToken, }) await newUser.save(); return { userId: newUser._id }; } 

fetchUser(disc_id) returns whether a user with the same discord id is found or not.

When testing with Jest i created the following test which passes just fine:

it("Should create a new user", async () => { const discord_id = "3452357445"; const moodle_token = "34ffDSE8439Ujfe8f3jj"; const { userId } = await createUser(discord_id, moodle_token); const user = await profileSchema.findById(userId); expect(user.discord_id).toEqual(discord_id); expect(user.moodle_token).toEqual(moodle_token); }) 

Now i want to test if the TypeError is thrown when trying to create a new user, with the same discord id, i tried the following without any success:

describe("Error when", () => { it("an existing matches discord id", async () => { const discord_id = "3452357445"; const moodle_token = "34ffDSE8439Ujfe8f3jj"; await createUser(discord_id, moodle_token) await expect(async () => { createUser(discord_id, moodle_token); }).rejects.toThrow(TypeError("The account already exist in the database!")) }) }) 

When running the tests this is the output from the console:

 FAIL test/manageUserDB.test.js Create new user ✓ Should create a new user (66 ms) Error when ✕ an existing matches discord id (3 ms) ● Create new user › Error when › an existing matches discord id TypeError: The account already exist in the database! 11 | 12 | if (profileData) { > 13 | throw TypeError("The account already exist in the database!"); | ^ 14 | } 15 | const newUser = new profileModel({ 16 | discord_id: disc_id, at createUser (BoodleDB/manageUserDB.js:13:15) at Object.<anonymous> (test/manageUserDB.test.js:29:13) Test Suites: 1 failed, 1 total Tests: 1 failed, 1 passed, 2 total Snapshots: 0 total Time: 0.6 s, estimated 1 s Ran all test suites matching /.\/test/i. 

EDIT

function fetchUser (disc_id) { return profileModel.findOne({ discord_id: disc_id }); } 
2
  • can you post your fetchData code?, it might be error whetn fetch the data Commented Mar 29, 2022 at 10:42
  • @bramastavikana I added fetchuser at the bottom Commented Mar 29, 2022 at 15:10

1 Answer 1

3

You need to await when you call createUser.

await expect(async () => { await createUser(discord_id, moodle_token); }).rejects.toThrow(TypeError("The account already exist in the database!")) 
Sign up to request clarification or add additional context in comments.

1 Comment

I needed to await it, but it is actually the .rejects part that did it for me. Spend a lot of time searching for that.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.