I want to unit test some functions in a node.js module. I think that mocking a 3rd module would be helpful. In particular to avoid hitting the database
# models/account.coffee
register = (email, password)->
sha_sum.update(password)
pw = sha_sum.digest('hex')
user =
email: email
password: sha_sum.digest('hex')
users_db.save user, (err, doc)->
register_callback(err)
account_module =
register: register
module.exports = account_module
This is the module that i want to test
# routes/auth.coffee
account = require '../models/account'
exports.auth =
post_signup: (req, res)->
email = req.body.email
password = req.body.password
if email and password
account.register(email, password)
res.send 200
else
res.send 400
I want to be able to test that hitting this url with the correct body in the post calls the account.register
function but i don't want the test to hit the database. I may not have implemented the account module yet.
The jasmine spec # specs/auth.test.coffee describe 'signup', ->
request = require 'request'
it 'should signup a user with username and password', (done)->
spyOn(account, 'register') # this does not work, account.register still called
url = root + '/signup'
headers =
"Content-Type": "application/json"
data =
email: '[email protected]'
password: 'pw'
body = JSON.stringify(data)
request {url: url, method: 'POST',json: data, headers: headers }, (err, response, body)->
expect(response.statusCode).toEqual(200)
done()
I have looked into several mocking libraries for node.js (https://github.com/easternbloc/Syringe, https://github.com/felixge/node-sandboxed-module) but so far no success. Whatever i try in the spec, the account.register
always get executed. Is this whole approach flawed?
Mocking is a process used in unit testing when the unit being tested has external dependencies. The purpose of mocking is to isolate and focus on the code being tested and not on the behavior or state of external dependencies.
In Jest, Node. js modules are automatically mocked in your tests when you place the mock files in a __mocks__ folder that's next to the node_modules folder. For example, if you a file called __mock__/fs. js , then every time the fs module is called in your test, Jest will automatically use the mocks.
Mocking means creating a fake version of an external or internal service that can stand in for the real one, helping your tests run more quickly and more reliably. When your implementation interacts with an object's properties, rather than its function or behavior, a mock can be used.
Jest is one of the most popular unit testing tools, for JavaScript in general and also for Node. js.
I am using mocha as the test framework and sinon for mocking, stubing and spying. I would suggest you delegate your account module to the auth.coffee module and mock it like so:
exports.init = function (account) {
// set account object
}
so from the mocha test you can then create a dummy account object and mock it with sinon in the actual test.
describe('some tests', function () {
var account, response, testObject;
beforeEach(function () {
account = {
register: function () { }
};
response = {
send: function () { }
};
testObject = require('./auth');
testObject.init(account);
});
it('should test something', function () {
var req = { body: { email: ..., password: .... } }, // the request to test
resMock = sinon.mock(response),
registerStub = sinon.stub(account, 'register');
// the request expectations
resMock.expect('send').once().withArgs(200);
// the stub for the register method to have some process
registerStub.once().withArgs('someargs');
testObject.auth(req. response);
resMock.verify();
});
});
Sorry for not writing it down in coffescript but I am not used to it.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With