Mocha timing out when test in Promise callback fails
If I have the following module:
module.exports = kontinue => {
Promise.resolve({error:null})
.then(o => {
console.log('promise resolved');
// say something goes wrong here
if(true)
kontinue({error:'promise resolved but something else went wrong'});
else kontinue(o);
})
.catch(error => {
console.log('caught error');
kontinue({error:'promise rejected, or resolved but then continuation threw exception'})
});
};
And the following test:
const assert = require('assert').strict;
const target = require('./the_above_code.js');
it('should not timeout', (done) => {
target((sut) => {
console.log('continuation called');
assert.ok(false); // the test for sut.error === what I expected was failing
done();
});
});
It outputs:
promise resolved
continuation called
caught error
...
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
I realise this is because the .catch() is returning a new promise which is not resolving, but that's not what I really want during testing.
How do I test the object a promise resolves to, fail the test if necessary, have Mocha report that failure?
Perhaps there is somewhere else other than in the continuation (which never returns in the code that uses this module) that I can put the tests?
I'm sure monads can reduce the amount of boilerplate code here, but using them surely would violate Kernighan's maxim.
mocha es6-promise
add a comment |
If I have the following module:
module.exports = kontinue => {
Promise.resolve({error:null})
.then(o => {
console.log('promise resolved');
// say something goes wrong here
if(true)
kontinue({error:'promise resolved but something else went wrong'});
else kontinue(o);
})
.catch(error => {
console.log('caught error');
kontinue({error:'promise rejected, or resolved but then continuation threw exception'})
});
};
And the following test:
const assert = require('assert').strict;
const target = require('./the_above_code.js');
it('should not timeout', (done) => {
target((sut) => {
console.log('continuation called');
assert.ok(false); // the test for sut.error === what I expected was failing
done();
});
});
It outputs:
promise resolved
continuation called
caught error
...
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
I realise this is because the .catch() is returning a new promise which is not resolving, but that's not what I really want during testing.
How do I test the object a promise resolves to, fail the test if necessary, have Mocha report that failure?
Perhaps there is somewhere else other than in the continuation (which never returns in the code that uses this module) that I can put the tests?
I'm sure monads can reduce the amount of boilerplate code here, but using them surely would violate Kernighan's maxim.
mocha es6-promise
What if you type return on Promise.resolve()?
– squeekyDave
Nov 14 '18 at 13:12
@squeekyDave I removed the braces so that the arrow function returned the result ofPromise.resolve().then().catch()
and it still timed out. I also tried removing thedone
parameter from the callback supplied toit()
but that meantassert.ok(false)
no longer caused a test failure.
– Nicholas Shanks
Nov 14 '18 at 13:34
I don't know how useful this will be but I faced a similar issue not long ago and the solution of my problem was to use a beforeEach hook where I typed this.timeout=10000. It was something like beforeEach(function(){ this.timeout=1000; // then i loaded my variable that returned a prmise }) And after that I was able to test. Hope this helps.
– squeekyDave
Nov 14 '18 at 13:39
@squeekyDave thanks, but my problem is not that the operation takes longer than the time-out duration (which increasing the timeout would solve), but rather that the test assertion throws an exception within the .then() and I don't know where else I can put it.
– Nicholas Shanks
Nov 14 '18 at 14:45
add a comment |
If I have the following module:
module.exports = kontinue => {
Promise.resolve({error:null})
.then(o => {
console.log('promise resolved');
// say something goes wrong here
if(true)
kontinue({error:'promise resolved but something else went wrong'});
else kontinue(o);
})
.catch(error => {
console.log('caught error');
kontinue({error:'promise rejected, or resolved but then continuation threw exception'})
});
};
And the following test:
const assert = require('assert').strict;
const target = require('./the_above_code.js');
it('should not timeout', (done) => {
target((sut) => {
console.log('continuation called');
assert.ok(false); // the test for sut.error === what I expected was failing
done();
});
});
It outputs:
promise resolved
continuation called
caught error
...
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
I realise this is because the .catch() is returning a new promise which is not resolving, but that's not what I really want during testing.
How do I test the object a promise resolves to, fail the test if necessary, have Mocha report that failure?
Perhaps there is somewhere else other than in the continuation (which never returns in the code that uses this module) that I can put the tests?
I'm sure monads can reduce the amount of boilerplate code here, but using them surely would violate Kernighan's maxim.
mocha es6-promise
If I have the following module:
module.exports = kontinue => {
Promise.resolve({error:null})
.then(o => {
console.log('promise resolved');
// say something goes wrong here
if(true)
kontinue({error:'promise resolved but something else went wrong'});
else kontinue(o);
})
.catch(error => {
console.log('caught error');
kontinue({error:'promise rejected, or resolved but then continuation threw exception'})
});
};
And the following test:
const assert = require('assert').strict;
const target = require('./the_above_code.js');
it('should not timeout', (done) => {
target((sut) => {
console.log('continuation called');
assert.ok(false); // the test for sut.error === what I expected was failing
done();
});
});
It outputs:
promise resolved
continuation called
caught error
...
Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves.
I realise this is because the .catch() is returning a new promise which is not resolving, but that's not what I really want during testing.
How do I test the object a promise resolves to, fail the test if necessary, have Mocha report that failure?
Perhaps there is somewhere else other than in the continuation (which never returns in the code that uses this module) that I can put the tests?
I'm sure monads can reduce the amount of boilerplate code here, but using them surely would violate Kernighan's maxim.
mocha es6-promise
mocha es6-promise
edited Nov 14 '18 at 13:30
Nicholas Shanks
asked Nov 14 '18 at 13:06
Nicholas ShanksNicholas Shanks
6,85414167
6,85414167
What if you type return on Promise.resolve()?
– squeekyDave
Nov 14 '18 at 13:12
@squeekyDave I removed the braces so that the arrow function returned the result ofPromise.resolve().then().catch()
and it still timed out. I also tried removing thedone
parameter from the callback supplied toit()
but that meantassert.ok(false)
no longer caused a test failure.
– Nicholas Shanks
Nov 14 '18 at 13:34
I don't know how useful this will be but I faced a similar issue not long ago and the solution of my problem was to use a beforeEach hook where I typed this.timeout=10000. It was something like beforeEach(function(){ this.timeout=1000; // then i loaded my variable that returned a prmise }) And after that I was able to test. Hope this helps.
– squeekyDave
Nov 14 '18 at 13:39
@squeekyDave thanks, but my problem is not that the operation takes longer than the time-out duration (which increasing the timeout would solve), but rather that the test assertion throws an exception within the .then() and I don't know where else I can put it.
– Nicholas Shanks
Nov 14 '18 at 14:45
add a comment |
What if you type return on Promise.resolve()?
– squeekyDave
Nov 14 '18 at 13:12
@squeekyDave I removed the braces so that the arrow function returned the result ofPromise.resolve().then().catch()
and it still timed out. I also tried removing thedone
parameter from the callback supplied toit()
but that meantassert.ok(false)
no longer caused a test failure.
– Nicholas Shanks
Nov 14 '18 at 13:34
I don't know how useful this will be but I faced a similar issue not long ago and the solution of my problem was to use a beforeEach hook where I typed this.timeout=10000. It was something like beforeEach(function(){ this.timeout=1000; // then i loaded my variable that returned a prmise }) And after that I was able to test. Hope this helps.
– squeekyDave
Nov 14 '18 at 13:39
@squeekyDave thanks, but my problem is not that the operation takes longer than the time-out duration (which increasing the timeout would solve), but rather that the test assertion throws an exception within the .then() and I don't know where else I can put it.
– Nicholas Shanks
Nov 14 '18 at 14:45
What if you type return on Promise.resolve()?
– squeekyDave
Nov 14 '18 at 13:12
What if you type return on Promise.resolve()?
– squeekyDave
Nov 14 '18 at 13:12
@squeekyDave I removed the braces so that the arrow function returned the result of
Promise.resolve().then().catch()
and it still timed out. I also tried removing the done
parameter from the callback supplied to it()
but that meant assert.ok(false)
no longer caused a test failure.– Nicholas Shanks
Nov 14 '18 at 13:34
@squeekyDave I removed the braces so that the arrow function returned the result of
Promise.resolve().then().catch()
and it still timed out. I also tried removing the done
parameter from the callback supplied to it()
but that meant assert.ok(false)
no longer caused a test failure.– Nicholas Shanks
Nov 14 '18 at 13:34
I don't know how useful this will be but I faced a similar issue not long ago and the solution of my problem was to use a beforeEach hook where I typed this.timeout=10000. It was something like beforeEach(function(){ this.timeout=1000; // then i loaded my variable that returned a prmise }) And after that I was able to test. Hope this helps.
– squeekyDave
Nov 14 '18 at 13:39
I don't know how useful this will be but I faced a similar issue not long ago and the solution of my problem was to use a beforeEach hook where I typed this.timeout=10000. It was something like beforeEach(function(){ this.timeout=1000; // then i loaded my variable that returned a prmise }) And after that I was able to test. Hope this helps.
– squeekyDave
Nov 14 '18 at 13:39
@squeekyDave thanks, but my problem is not that the operation takes longer than the time-out duration (which increasing the timeout would solve), but rather that the test assertion throws an exception within the .then() and I don't know where else I can put it.
– Nicholas Shanks
Nov 14 '18 at 14:45
@squeekyDave thanks, but my problem is not that the operation takes longer than the time-out duration (which increasing the timeout would solve), but rather that the test assertion throws an exception within the .then() and I don't know where else I can put it.
– Nicholas Shanks
Nov 14 '18 at 14:45
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53300946%2fmocha-timing-out-when-test-in-promise-callback-fails%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53300946%2fmocha-timing-out-when-test-in-promise-callback-fails%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
What if you type return on Promise.resolve()?
– squeekyDave
Nov 14 '18 at 13:12
@squeekyDave I removed the braces so that the arrow function returned the result of
Promise.resolve().then().catch()
and it still timed out. I also tried removing thedone
parameter from the callback supplied toit()
but that meantassert.ok(false)
no longer caused a test failure.– Nicholas Shanks
Nov 14 '18 at 13:34
I don't know how useful this will be but I faced a similar issue not long ago and the solution of my problem was to use a beforeEach hook where I typed this.timeout=10000. It was something like beforeEach(function(){ this.timeout=1000; // then i loaded my variable that returned a prmise }) And after that I was able to test. Hope this helps.
– squeekyDave
Nov 14 '18 at 13:39
@squeekyDave thanks, but my problem is not that the operation takes longer than the time-out duration (which increasing the timeout would solve), but rather that the test assertion throws an exception within the .then() and I don't know where else I can put it.
– Nicholas Shanks
Nov 14 '18 at 14:45