A mock for mongodbs/mongoose's mapReduce in order to achieve testability
npm install mock-reduce
var mockReduce = require('mock-reduce');
So far I have only tested implementations with node for jasmine. Generally it should work with any other testing framework.
var mongoose = require('mongoose');
var mockReduce = require('mock-reduce');
describe('Mongoose Test', function() {
it('runs a mock reduce and returns the expected data', function() {
var testData = [
{"someId": 42, "someString": "Chickens don't clap!", "value": 4},
{"someId": 5, "someString": "I'm on the job.", "value": 5},
{"someId": 42, "someString": "Annyong", "value": 8},
{"someId": 5, "someString": "Come on, this is a Bluth family celebration.", "value": 5}
];
var reducedData = [
{"_id": 5, value: 10},
{"_id": 42, value: 12}
];
mockReduce.install(mongoose);
mockReduce.setNextTestData(testData);
var model = require('./models/myModel');
var result = model.someMethodThatCallsMapReduce();
expect(result).toEqual(reducedData);
mockReduce.uninstall();
});
});
See file spec/integration/mongoose-spec.js for an extended test example
Caution: This feature is still work in progress. Generally it should work, I haven't fully tested it yet
var mongodb = require('mongodb');
var mockReduce = require('mock-reduce');
describe('node-mongodb-native Test', function() {
it('runs a mock reduce and returns the expected data', function() {
var testData = [
{"someId": 42, "someString": "Chickens don't clap!", "value": 4},
{"someId": 5, "someString": "I'm on the job.", "value": 5},
{"someId": 42, "someString": "Annyong", "value": 8},
{"someId": 5, "someString": "Come on, this is a Bluth family celebration.", "value": 5}
];
var reducedData = [
{"_id": 5, value: 10},
{"_id": 42, value: 12}
];
mockReduce.install(mongodb);
mockReduce.setNextTestData(testData);
mongodb.connect('mongodb://localhost:27017/test', function(err, db) {
var collection = db.collection('collection_name');
var map = function() {...}
var reduce = function() {...}
var options = {
scope: {
additional: 'variable'
}
};
var result = collection.mapReduce(map, reduce, options);
});
expect(result).toEqual(reducedData);
mockReduce.uninstall();
});
});
MockReduce stores almost every step of a map reduce operation. Try one of the following methods:
mockReduce.map.getEmits();
mockReduce.map.getMappedData();
mockReduce.reduce.getReducedData();
So far the following methods are supported:
- map
- reduce
- finalize
- scope
- done callback
MockReduce was completely developed test-driven. If you wish to run its own tests, clone the git repo and run
npm install
npm test
- Security: Fix security vulnerabilities in mongoose and karma dependencies
- Change: Do not put MockReduce and all subclasses into global scope but instead use require
- Bugfix: Make sure index.js is required uncached in tests
- Update: Bump mongoose to version 5.7.10
- Update: Bump jasmine to version 3.5.0
- Bugfix: Don't break when connect is called without a callback
- Install does not break the original connector when running twice
- Fixed "window is not defined" issue
- MockReduce can now be used directly within node itself (PhantomJS not needed anymore)