DEV Community

Discussion on: Unit testing NestJS with mongo in memory...

Collapse
 
chomikpawel profile image
Pawel Chomiczewski •

Hello there,

I write down everything as you posted but I still get warning in jest:
"A worker process has failed to exit gracefully and has been force exited. This is likely caused by tests leaking due to improper teardown. Try running with --detectOpenHandles to find leaks."
Do you know how to fix it?

Collapse
 
bassochette profile image
Julien Prugne Webeleon •

Hi Pawel,

Sometimes I have this message. I tweaked a bit by test command with a few options.

"test": "jest --force-exit --detectOpenHandles",
"test:watch": "jest --watch --detectOpenHandles",
"test:cov": "jest --coverage --force-exit --detectOpenHandles",
Enter fullscreen mode Exit fullscreen mode

--detectOpenHandles should help you find the non-closing process. It might also remove the message

--force-exit will make sure to kill the process and allow your test to run smoothly on CI environments. It is a bit barbaric but it gets the job done.

I've done a few tests before replying. The first screenshot does not use the --detectOpenHandles options and the seconds do.

"test:watch": "jest --watch",
without --detectOpenHandles

"test:watch": "jest --watch --detectOpenHandles",
with --detectOpenHandles

Collapse
 
chomikpawel profile image
Pawel Chomiczewski • • Edited

Hello, thank you for your answer but those flags unfortunately don't turn off those warnings but I just wanted to know if those warnings mean anything meaningful or should I just brush it off? Cheers!

Edit. I'm fairly new to Node/Nest stuff, could you please also tell me how can I add helper method to this utility to clear all collections? Cheers!

Thread Thread
 
bassochette profile image
Julien Prugne Webeleon • • Edited

You don't need to clear collection between tests since it's a new in-memory mongo.

during the test I do something like that:

beforeEach(async () => {
      const myModel = module.get<Model<someDocument>>('MyModel')
      await myModel.deleteMany({});
});
Enter fullscreen mode Exit fullscreen mode

like the service in the test, the module needs to be accessible.

Thread Thread
 
chromey profile image
Christian Romeyke • • Edited

Could you maybe provide a full example of that? I tried to get this working in my own repo and in yours, using the Squid model, but got an error in both cases: Nest could not find Squid element (this provider does not exist in the current context). Much appreciated!

Thread Thread
 
bassochette profile image
Julien Prugne Webeleon •

You can check my Colonie repo. The pvp-shield module have the in memory db, collection deletion between it and the way to get the model from the testing module.
github.com/bassochette/colonies/tr...

Thread Thread
 
chromey profile image
Christian Romeyke •

Thanks a lot, I managed to do it! For others who might struggle: I wasn't aware of the convention for the model name to use in module.get(). It's the name property that gets passed into MongooseModule.forFeature() + the suffix 'Model' (SquidModel in this example). Apologies if this obvious, but this string is never explicitly defined as a constant or class name etc.

Thread Thread
 
bassochette profile image
Julien Prugne Webeleon •

Oh, that's really not obvious...
I found this trick by mimicking the underlying metod of InjectModel from the nest/mongoose repo.
github.com/nestjs/mongoose/blob/28...