Mocking Libray with Strict Expectations for NodeJS
MockExpect allows you to set strict expectations on your test dependencies. What this means is that you can assert that your dependencies will not have any unexpected behavior in your production code.
You can create mocks in 2 different ways with MockExpect. You can simply spy on a function, as most mocking libraries allow you to do, or you can spy on a constructor function (one that is meant to be invoked with new). When you spy on a constructor function, all of the functions defined on the object's prototype will be spied on. This helps to ensure you adhere to the contract of the "type" of your dependencies without having to build out fake objects in test code that match your dependencies.
var mockexpect = require('mockexpect');
var DummyObject = function () {};
DummyObject.prototype.testFunction = function () {};
var mockDummyObject = mockexpect.mock(DummyObject);
mockDummyObject.testFunction.expect.toHaveBeenCalled();
mockDummyObject.testFunction();
mockDummyObject.assertExpectations();
If you were to invoke testFunction()
in your code without setting an expectation, your tests would fail for not having an expectation set. toHaveBeenCalled()
also takes an optional call count parameter, so you can expect an exact number of calls (the default is 1).
mockDummyObject.testFunction.expect.toHaveBeenCalled(3);
mockDummyObject.testFunction.expect.toHaveBeenCalledWith('a', 3);
mockDummyObject.testFunction.expect.toHaveBeenCalledWith(new mockexpect.Matcher(Function));
mockDummyObject.testFunction(function() {});
mockDummyObject.testFunction.expect.toHaveBeenCalled().andCall(function () {});
mockDummyObject.testFunction.expect.toHaveBeenCalled().andReturn('some value');
DummyObject.someFunction = function () {};
mockexpect.spyOn(DummyObject, 'someFunction');
DummyObject.someFunction.expect.toHaveBeenCalled();
If an object that is being mocked is an instance of the nodejs EventEmitter, then the EventEmitter functions will NOT be mocked out. This is intentionally done to facilitate easier testing of event listening and dispatching.
DummyObject.prototype = new EventEmitter();
mockDummyObject = mockexpect.mock(DummyObject);
mockDummyObject.emit('someEvent');