Sie sollten Mocha laufen mit der --delay
Option, und dann run()
benutzen, wenn Sie Ihre Testsuite Gebäude fertig sind. Hier ist ein Beispiel aus dem Code abgeleitet Sie in der Frage zeigen:
'use strict';
function test() {
console.log(1);
describe('Unit Testing',() => {
console.log(2);
it("test",() => {
console.log(3);
});
});
// You must use --delay for `run()` to be available to you.
run();
}
setTimeout(test, 1000);
I setTimeout
bin mit einem asynchronen Betrieb zu simulieren. Mit --delay
und run()
können Sie eine Suite erstellen, die das Ergebnis einer asynchronen Berechnung ist. Beachten Sie jedoch, dass die Suite in einem Schuss gebaut werden muss. (Sie können nicht einen asynchronen Prozess innerhalb describe
haben, die Anrufe zu it
machen Das wird nicht funktionieren..)
Eine Sache, die Sie sollten auf jeden Fall nicht ist, was rob3c suggests: describe
oder it
(oder beide) Aufruf von innen ein Haken. Dies ist ein Fehler, den die Leute immer wieder machen, deshalb lohnt es sich, im Detail zu sprechen. Das Problem ist, dass es von Mocha einfach nicht unterstützt wird und daher keine etablierte Semantik mit dem Aufruf von describe
oder it
von innerhalb eines Hooks verbunden ist. Oh, ist es möglich, einfache Beispiele zu schreiben, wie man arbeiten könnte erwarten, aber:
Wenn die Suite komplexer wird, das Verhalten der Suite nicht mehr entspricht etwas sinnvoll.
Da mit diesem Ansatz keine Semantik verbunden ist, können neuere Mocha-Versionen die fehlerhafte Verwendung anders behandeln und Ihre Suite beschädigen.
dieses einfache Beispiel betrachten:
const assert = require("assert");
const p = Promise.resolve(["foo", "bar", "baz"]);
describe("top",() => {
let flag;
before(() => {
flag = true;
return p.then((names) => {
describe("embedded",() => {
for (const name of names) {
it(name,() => {
assert(flag);
});
}
});
});
});
after(() => {
flag = false;
});
it("regular test",() => {
assert(flag);
});
});
Wenn wir es laufen, erhalten wir:
top
✓ regular test
embedded
1) foo
2) bar
3) baz
1 passing (32ms)
3 failing
// [stack traces omitted for brevity]
Was hier los? Sollten nicht alle Tests bestanden werden? Wir setzen flag
auf true
im before
Haken für die top
beschreiben. Alle Tests, die wir darin erstellen, sollten flag
als true
sehen, nicht? Der Hinweis ist in der Ausgabe oben: wenn wir Tests innerhalb eines Hooks erstellen, wird Mocha die Tests irgendwo setzen, aber es kann nicht an einem Ort sein, der die Struktur der describe
Blöcke im Code widerspiegelt. Was passiert in diesem Fall ist, dass Mocha fügt nur die Tests erstellt in den Haken das Ende der Suite, außerhalb der top
beschreiben, so dass die after
Hook läuft vor den dynamisch erstellten Tests, und wir erhalten ein kontraintuitives Ergebnis .
Mit --delay
und run()
, können wir eine Suite schreiben, die mit Intuition in einer Art und Weise concordant verhält:
const assert = require("assert");
const p = Promise.resolve(["foo", "bar", "baz"]).then((names) => {
describe("top",() => {
let flag;
before(() => {
flag = true;
});
after(() => {
flag = false;
});
describe("embedded",() => {
for (const name of names) {
it(name,() => {
assert(flag);
});
}
});
it("regular test",() => {
assert(flag);
});
});
run();
});
Ausgang:
top
✓ regular test
embedded
✓ foo
✓ bar
✓ baz
4 passing (19ms)
Dies ist, wie ich bin mit 'before', die nicht genannt werden:' beschreibt ('Unit Testing',() => { vor (next = > config.build(). dann (next)); require ('./ auth'); }); ' – terpak