This is a question regarding asynchronoust testing in Sails JS using Mocha.
I am writing controller test in Sails JS using supertest library. I want to check if a method is being called on HTTP POST to our controller. For that, I am stubbing the method and expecting it to be invoked in the end()
as follows:
request(sails.hooks.http.app)
.post('heartbeat/create')
.send('device: 1')
.end(function(err, res) {
expect(publishCreateStub.called).to.be.true;
done();
});
When I run this, the expectation fails because the method is not called when asserting. But when I put the expectation in a setTimeout
as follows, it works:
request(sails.hooks.http.app)
.post('heartbeat/create')
.send('device: 1')
.end(function(err, res) {
setTimeOut(function() {
expect(publishCreateStub.called).to.be.true;
done();
}, 1000);
});
Is there any way to make the test pass without a setTimeout
?
Here is the code part I am testing: HeartbeatController#create
You can also help us to resolve the issue by sending pull requests: https://github.com/multunus/one-mdm/issues/1
The actual problem is that your controller don't wait for
publishCreate
to be called. So, you're responding with201 Created
without checking that anything was created.There is a chance that either
Heartbeat.findOne
orHeartbeat.publishCreate
will fail, but you'll newer know it.To fix this problem you should modify your controller, moving response part inside
Heartbeat
promise callback:In my example I'm delegating an actual error handling to the next express error-handling middleware:
But you may decide to handle the error yourself instead, e.g.: