Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the point of the done() callback?

Tags:

In Mochajs, they use done() to test for asynchronous code, like so:

describe('User', function() {   describe('#save()', function() {     it('should save without error', function(done) {       var user = new User('Luna');       user.save(function(err) {         if (err) throw err;         done();       });     });   }); }); 

What does this mean exactly? I did console.log(done.toString()) and I got this:

function (err) {   if (err instanceof Error || toString.call(err) === '[object Error]') {     return done(err);   }   if (err) {     if (Object.prototype.toString.call(err) === '[object Object]') {       return done(new Error('done() invoked with non-Error: '         + JSON.stringify(err)));     }     return done(new Error('done() invoked with non-Error: ' + err));   }   done(); } 

Is the done() at the very end here different than the done() in the first piece of code?

like image 947
ThePumpkinMaster Avatar asked Jun 05 '16 21:06

ThePumpkinMaster


People also ask

What is done callback in JavaScript?

A JavaScript callback is a function which is to be executed after another function has finished execution. A more formal definition would be - Any function that is passed as an argument to another function so that it can be executed in that other function is called as a callback function.

What is the purpose of the callback function?

A callback function is a function that is passed as an argument to another function, to be “called back” at a later time. A function that accepts other functions as arguments is called a higher-order function, which contains the logic for when the callback function gets executed.

What is done function?

done is just a non-official standard name for a function (a.k.a callback) that informs the calling function (parent in stacktrace) that a task is completed.

What is done () in Mocha?

This argument is a function, and is usually called done by convention. This signals to Mocha that what we're doing inside of before() runs asynchronously, and tells it to wait until we call done() to start running the tests. Notice where we call done() inside of the callback that gets err, window as its arguments.


2 Answers

Mocha is able to handle synchronous and asynchronous tests. When you run a synchronous test, you can just pass it as an anonymous function to it and you don't have to do anything else: Mocha knows the test is over when the function returns. However, if you are running an asynchronous test, you have to tell Mocha that the test is asynchronous. There are two ways to do this:

  1. Declare that the anonymous function you pass to it takes a parameter. Mocha will call your anonymous function with a single parameter which is a function you must call to indicate that your test is over. (This parameter is called done due to tradition. You could call it complete, cb or platypus and it would work just the same.) If you call done without a value, the test is successful. With a value, the test is a failure and the value should be an Error object or an object derived from Error.

  2. Return a promise: Mocha will wait for the promise to be resolved or rejected. If resolved, the test is successful. If rejected, the test failed.

The code you see when you do done.toString() is just the code of the function that Mocha passes to your test when you declare it to take a parameter. You can see in it some of what I mentioned above (e.g. if you pass a parameter to done it should be an Error or derived from Error). The done in there is another done function which is private to Mocha.

like image 111
Louis Avatar answered Oct 20 '22 20:10

Louis


Because of asynchronous nature of node.js, you have to tell to Mocha that your finished test.

For classic synchronous languages, you are done when the method has finished. But in node, first the whole method is executed and then, some time after is executed inner body of user.save().

The Mocha just waits with test until done(), is called, because it does not have any other option to find if something else should be executed or it is finished.

The output you have is just body of function done.

like image 36
libik Avatar answered Oct 20 '22 22:10

libik