Вы должны запустить Mocha с опцией --delay
, а затем использовать run()
как только вы закончите строить свой набор тестов. Ниже приведен пример, полученный из кода вы показываете в вопросе:
'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);
Я использую setTimeout
для имитации асинхронной операции. Используя --delay
и run()
, вы можете создать набор, который является результатом асинхронного вычисления. Обратите внимание, однако, что набор должен быть построен одним выстрелом. (Вы не можете иметь асинхронный процесс внутри describe
который будет совершать звонки на it
Это не будет работать..)
Одна вещь, вы должны определенно не сделать, это то, что rob3c suggests: вызов describe
или it
(или оба) изнутри крючка. Это ошибка, из-за которой время от времени люди делают так, что стоит подробно остановиться. Проблема в том, что Mocha просто не поддерживается, поэтому нет установленной семантики, связанной с вызовом describe
или it
изнутри крючка. О, можно писать простые примеры, которые работают, как один не может ожидать, но:
Когда свита становится все более сложной, поведение люкса больше не соответствует ничего толкового.
Поскольку семантики, связанные с этим подходом, не имеют новых версий, новые версии Mocha могут обрабатывать ошибочное использование по-разному и разбивать ваш пакет.
Рассмотрим простой пример:
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);
});
});
Когда мы бежим, мы получим:
top
✓ regular test
embedded
1) foo
2) bar
3) baz
1 passing (32ms)
3 failing
// [stack traces omitted for brevity]
Что здесь происходит? Разве не все тесты проходят? Мы установили flag
в true
в before
крюк для top
опишите. Все тесты, которые мы создаем в нем, должны видеть flag
как true
, нет? Ключ находится в выводе выше: когда мы создаем тесты внутри крючка, Mocha ставит тесты где-то, но может быть не в том месте, которое отражает структуру блоков describe
в коде. Что происходит в этом случае - это то, что Mocha просто добавляет тесты, созданные на крючке, самый конец набора, за пределами top
, описывается, так что крючок after
выполняется перед динамически создаваемыми тестами, и мы получаем контринтуитивный результат ,
Использование --delay
и run()
, мы можем написать пакет, который ведет себя таким образом, согласные с интуицией:
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();
});
Выход:
top
✓ regular test
embedded
✓ foo
✓ bar
✓ baz
4 passing (19ms)
Это, как я использую 'before', который не вызывается:' описать ('Unit Testing',() => { ранее (следующая = > config.build(). then (next)); require ('./ auth'); }); ' – terpak