From aa0f9eae98f30bc8411185a9843ebcaf6e0bc585 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Yves=20G=C3=A9rardy?= Date: Sun, 27 May 2018 23:21:31 +0200 Subject: [PATCH] [ospec] o.defaultTimeout => o.specTimeout, and documentation. The timeout parameter is deprecated but will still work for now --- ospec/README.md | 44 ++++++++++++++++++++++++++++++--------- ospec/ospec.js | 12 +++++------ ospec/tests/test-ospec.js | 18 +++++++++------- 3 files changed, 50 insertions(+), 24 deletions(-) diff --git a/ospec/README.md b/ospec/README.md index 38aae7b4..83a2fed7 100644 --- a/ospec/README.md +++ b/ospec/README.md @@ -164,30 +164,54 @@ o("promise test", async function() { }) ``` -By default, asynchronous tests time out after 20ms. This can be changed on a per-test basis using the `timeout` argument: +#### Timeout delays + +By default, asynchronous tests time out after 200ms. You can change that default for the current test suite and +its children by using the `o.specTimeout(delay)` function. + +```javascript +o.spec("a spec that must timeout quickly", function(done, timeout) { + // wait 20ms before bailing out of the tests of this suite and + // its descendants + o.specTimeout(20) + o("some test", function(done) { + setTimeout(done, 10) // this will pass + }) + + o.spec("a child suite where the delay also applies", function () { + o("some test", function(done) { + setTimeout(done, 30) // this will time out. + }) + }) +}) +o.spec("a spec that uses the default delay", function() { + // ... +}) +``` + +This can also be changed on a per-test basis using the `o.timeout(delay)` function from within a test: ```javascript o("setTimeout calls callback", function(done, timeout) { - timeout(50) //wait 50ms before bailing out of the test + o.timeout(500) //wait 50ms before bailing out of the test - setTimeout(done, 30) + setTimeout(done, 300) }) ``` -Note that the `timeout` function call must be the first statement in its test. This currently does not work for promise tests. You can combine both methods to do this: +Note that the `o.timeout` function call must be the first statement in its test. It also works with Promise-returning tests: ```javascript -o("promise test", function(done, timeout) { - timeout(1000) - someOtherAsyncFunctionThatTakes900ms().then(done) +o("promise test", function() { + o.timeout(1000) + return someOtherAsyncFunctionThatTakes900ms() }) ``` ```javascript -o("promise test", async function(done, timeout) { - timeout(1000) +o("promise test", async function() { + o.timeout(1000) await someOtherAsyncFunctionThatTakes900ms() - done() }) ``` diff --git a/ospec/ospec.js b/ospec/ospec.js index 37b3f659..ea542f82 100644 --- a/ospec/ospec.js +++ b/ospec/ospec.js @@ -25,11 +25,11 @@ else window.o = m() o.after = hook("\x01after") o.beforeEach = hook("\x01beforeEach") o.afterEach = hook("\x01afterEach") - o.defaultTimeout = function (t) { - if (isRunning()) throw new Error("o.defaultTimeout() can only be called before o.run()") - if (hasOwn.call(ctx, "\x01defaultTimeout")) throw new Error("A default timeout has already been defined in this context") - if (typeof t !== "number") throw new Error("o.defaultTimeout() expects a number as argument") - ctx["\x01defaultTimeout"] = t + o.specTimeout = function (t) { + if (isRunning()) throw new Error("o.specTimeout() can only be called before o.run()") + if (hasOwn.call(ctx, "\x01specTimeout")) throw new Error("A default timeout has already been defined in this context") + if (typeof t !== "number") throw new Error("o.specTimeout() expects a number as argument") + ctx["\x01specTimeout"] = t } o.new = init o.spec = function(subject, predicate) { @@ -97,7 +97,7 @@ else window.o = m() }, null), 200 /*default timeout delay*/) function test(spec, pre, post, finalize, defaultDelay) { - if (hasOwn.call(spec, "\x01defaultTimeout")) defaultDelay = spec["\x01defaultTimeout"] + if (hasOwn.call(spec, "\x01specTimeout")) defaultDelay = spec["\x01specTimeout"] pre = [].concat(pre, spec["\x01beforeEach"] || []) post = [].concat(spec["\x01afterEach"] || [], post) series([].concat(spec["\x01before"] || [], Object.keys(spec).reduce(function(tasks, key) { diff --git a/ospec/tests/test-ospec.js b/ospec/tests/test-ospec.js index a3ef11a0..d4748545 100644 --- a/ospec/tests/test-ospec.js +++ b/ospec/tests/test-ospec.js @@ -360,12 +360,12 @@ o.spec("ospec", function() { }) }) }) - o.spec("o.defaultTimeout", function() { + o.spec("o.specTimeout", function() { o("throws when called inside of test definitions", function(done) { var err var oo = o.new() oo("", function() { - try { oo.defaultTimeout(5) } catch (e) {err = e} + try { oo.specTimeout(5) } catch (e) {err = e} return {then: function(f) {setTimeout(f)}} }) oo.run(function(){ @@ -378,7 +378,7 @@ o.spec("ospec", function() { var oo = o.new() var t - oo.defaultTimeout(10) + oo.specTimeout(10) oo.beforeEach(function () { t = new Date }) @@ -405,7 +405,7 @@ o.spec("ospec", function() { var oo = o.new() var t - oo.defaultTimeout(10) + oo.specTimeout(10) oo.beforeEach(function () { t = new Date }) @@ -418,7 +418,7 @@ o.spec("ospec", function() { oo.spec("nested 1", function () { var t - oo.defaultTimeout(30) + oo.specTimeout(30) oo.beforeEach(function () { t = new Date }) @@ -445,7 +445,7 @@ o.spec("ospec", function() { oo.spec("deeply", function() { var t - oo.defaultTimeout(20) + oo.specTimeout(20) oo.beforeEach(function () { t = new Date }) @@ -489,7 +489,8 @@ o.spec("ospec", function() { o(err.message).equals("`oodone()` should only be called once") }) oo.run(function(results) { - o(results.length).equals(0) + o(results.length).equals(1) + o(results[0].pass).equals(true) done() }) }) @@ -507,7 +508,8 @@ o.spec("ospec", function() { o(err.message).equals("`oodone()` should only be called once") }) oo.run(function(results) { - o(results.length).equals(0) + o(results.length).equals(1) + o(results[0].pass).equals(true) done() }) })