Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - Legiew/mongodb-memory-server: Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run. · GitHub
Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Legiew/mongodb-memory-server: Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run. · GitHub
Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Legiew/mongodb-memory-server: Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run. · GitHub
Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - Legiew/mongodb-memory-server: Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run. · GitHub
Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - Legiew/mongodb-memory-server: Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run. · GitHub
Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); })(); GitHub - Legiew/mongodb-memory-server: Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run. · GitHub
Skip to content

Repository files navigation

mongodb-memory-server

travis buildNPM versionDownloads statTravisCommitizen friendly

This package spins up a actual/real MongoDB Server programmatically from node for testing or mocking during development. By default it holds the data in memory. Fresh spinned up mongod process takes about 7Mb of memory. The server will allow you to connect your favorite ODM or client library to the MongoDB Server and run integration tests isolated from each other.

This package on first start downloads the latest MongoDB binaries and save it to ~/.mongodb-binaries folder. So first run may take a time. All further runs will fast, because use already downloaded binaries.

Every MongodbMemoryServer instance creates and starts fresh MongoDB server on some free port. You may start up several mongod simultaneously. When you terminate your script or call stop() MongoDB server(s) will be automatically shutdown.

Perfectly works with Travis CI without additional services and addons options in .travis.yml.

Installation

yarn add mongodb-memory-server --dev
OR
npm install mongodb-memory-server --save-dev

Usage

Simple server start:

importMongodbMemoryServerfrom'mongodb-memory-server';constmongod=newMongodbMemoryServer();consturi=awaitmongod.getConnectionString();constport=awaitmongod.getPort();constdbPath=awaitmongod.getDbPath();constdbName=awaitmongod.getDbName();// some code// you may stop mongod manuallymongod.stop();// or it will be stopped automatically when you exit from script

Available options

All options are optional.

constmongod=newMongodbMemoryServer({instance: {port?: ?number,// by default choose any free portdbName?: string,// by default generate random dbNamedbPath?: string,// by default create in temp directorystorageEngine?: string,// by default `ephemeralForTest`debug?: boolean,// by default false},binary: {version?: string,// by default '3.4.4'downloadDir?: string,// by default %HOME/.mongodb-binariesplatform?: string,// by default os.platform()arch?: string,// by default os.arch()debug?: boolean,// by default false},debug?: boolean,// by default falseautoStart?: boolean,// by default true});

Simple test with MongoClient

Take a look at this test file.

Provide connection string to mongoose

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';constmongoServer=newMongodbMemoryServer();mongoose.Promise=Promise;mongoServer.getConnectionString().then((mongoUri)=>{constmongooseOpts={// options for mongoose 4.11.3 and aboveautoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoose.connect(mongoUri,mongooseOpts);mongoose.connection.on('error',(e)=>{if(e.message.code==='ETIMEDOUT'){console.log(e);mongoose.connect(mongoUri,mongooseOpts);}console.log(e);});mongoose.connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});

For additional information I recommend you to read this article Testing a GraphQL Server using Jest with Mongoose

Several mongoose connections simultaneously

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';mongoose.Promise=Promise;constmongoServer1=newMongodbMemoryServer();constmongoServer2=newMongodbMemoryServer();// Firstly create connection objects, which you may import in other files and create mongoose models.// Connection to databases will be estimated later (after model creation).constconnections={conn1: mongoose.createConnection(),conn2: mongoose.createConnection(),conn3: mongoose.createConnection(),};constmongooseOpts={// options for mongoose 4.11.3 and above
promiseLibrary =Promise;
autoReconnect: true,reconnectTries: Number.MAX_VALUE,reconnectInterval: 1000,useMongoClient: true,// remove this line if you use mongoose 5 and above};mongoServer1.getConnectionString('server1_db1').then((mongoUri)=>{connections.conn1.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer1.getConnectionString('server1_db2').then((mongoUri)=>{connections.conn2.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});mongoServer2.getConnectionString('server2_db').then((mongoUri)=>{connections.conn3.open(mongoUri,mongooseOpts);connection.once('open',()=>{console.log(`MongoDB successfully connected to ${mongoUri}`);});});exportdefaultconnections;// somewhere in other fileimport{Schema}from'mongoose';import{conn1,conn2,conn3}from'./file_above';constuserSchema=newSchema({name: String,});consttaskSchema=newSchema({userId: String,task: String,});exportdefault{User: conn1.model('user',userSchema),Task: conn2.model('task',taskSchema),UserOnServer2: conn3.model('user',userSchema),}

Note: When you create mongoose connection manually, you should do:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and aboveconstconn=mongoose.createConnection();// just create connection instanceconstUser=conn.model('User',newmongoose.Schema({name: String}));// define modelconn.open(uri,opts);// open connection to database (NOT `connect` method!)

With default connection:

importmongoosefrom'mongoose';constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovemongoose.connect(uri,opts);constUser=mongoose.model('User',newmongoose.Schema({name: String}));// define model

Simple Mocha/Chai test example

Start Mocha with --timeout 60000 cause first download of MongoDB binaries may take a time.

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebefore((done)=>{mongoServer=newMongodbMemoryServer();mongoServer.getConnectionString().then((mongoUri)=>{returnmongoose.connect(mongoUri,opts,(err)=>{if(err)done(err);});}).then(()=>done());});after(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).to.equal(0);});});

Simple Jest test example

importmongoosefrom'mongoose';importMongodbMemoryServerfrom'mongodb-memory-server';// May require additional time for downloading MongoDB binariesjasmine.DEFAULT_TIMEOUT_INTERVAL=60000;letmongoServer;constopts={useMongoClient: true};// remove this option if you use mongoose 5 and abovebeforeAll(async()=>{mongoServer=newMongodbMemoryServer();constmongoUri=awaitmongoServer.getConnectionString();awaitmongoose.connect(mongoUri,opts,(err)=>{if(err)console.error(err);});});afterAll(()=>{mongoose.disconnect();mongoServer.stop();});describe('...',()=>{it("...",async()=>{constUser=mongoose.model('User',newmongoose.Schema({name: String}));constcnt=awaitUser.count();expect(cnt).toEqual(0);});});

Additional examples of Jest tests:

AVA test runner

For AVA written detailed tutorial how to test mongoose models by @zellwk.

Travis

You may cache downloaded MongoDB binaries on Travis to speed up further tests:

cache:
directories:
- $HOME/.mongodb-binaries

Also it is very important to limit spawned number of Jest workers for avoiding race condition. Cause Jest spawn huge amount of workers for every node environment on same machine. More details Use --maxWorkers 4 or --runInBand option.

script:
- - yarn run coverage+ - yarn run coverage -- --maxWorkers 4

Credits

Inspired by alternative runners for mongodb-prebuilt:

License

MIT

About

Spinning up mongod in memory for fast tests. If you run tests in parallel this lib helps to spin up dedicated mongodb servers for every test file run.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages