Как запустить асинхронные функции перед подключением в MochaJS? - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь вызвать много асинхронных функций в моем mocha JS перед хуком, но они наконец-то выполняются.В основном я пытаюсь выполнить повторные тесты с различными параметрами из инициализации конструктора.

Я пытался только с одной функцией, но она также выполняется наконец. Попытка передать функцию done () во внутреннюю асинхронную функцию, но это не помогаетлибо.

a.test.js и base.tests.js файлы:

describe('Test block', () => {
    before((done) => {
            const baseClass = new baseClass()
            baseTests.applyTests(done)
        });
    describe('test',()=>{
    ....first which should be executed;
    })
}
----------------------------------------------------------------
class baseClass {

    constructor() {
        init smth....
    }

    async applyTests(done) {
        await Promise.All(
        [
            a(),
            b(),
            c()
        ]
        done();
        )
    }
    async a() {
        return describe('TEST', () => {
            it('TEST', (done) => {
                chai.request(server)
                    .get(url)
                    .end((err, res) => {
                        asserts...
                        done();
                    });
            });
        }}

Я ожидаю сначала выполнить асинхронные операции в хуке before, а после этого - все остальные тесты.

1 Ответ

0 голосов
/ 21 декабря 2018

Имейте в виду, что блоки describe и it не выполняют никаких тестов;они добавляют тесты в список тестов , который будет выполнять Mocha.Помещение блока describe в функцию, вызываемую из ловушки before, как это, никогда не приведет к выполнению кода вроде chai.request(... и т. Д. (И даже если бы он это сделал, он был бы полностью нарушен: ловушка before запускается перед каждымтест, вы не хотите делать утверждения там, потому что он не будет связан с каким-либо конкретным модульным тестом.)

Я не могу дать более конкретный совет, потому что я не уверен, что вы пыталисьВыполните, но в целом ваши блоки describe и it должны быть конструкциями верхнего уровня, а не помещаться внутри другого кода, подобного этому.

РЕДАКТИРОВАТЬ: просто чтобы прояснить путь выполнения здесь: ваш перед ловушкойЗапускает, который вызывает applyTests, который вызывает a(), который выполняет блок описания и добавляет ваш тестовый модуль TEST в список тестов, а затем возвращается.Затем он запускает тесты, включая test и TEST.

РЕДАКТИРОВАТЬ: Ах, имеет смысл, позвольте мне предложить два шаблона, которые часто используются в модульных тестах.

Шаблон 1: «Тестовый цикл»

Этот шаблон создает множество похожих тестов, используя массив входных параметров для создания соответствующих описаний тестов и тестовых тел.

[
    { foo: "milk", bar: "smoothie" },
    { foo: "yogurt", bar: "fridge" },
    { foo: "whatever", bar: "container" }
].forEach(test => {
    it("puts the " + test.foo + " in the " + test.bar, function () {
        assert(subject.someMethod(foo) === bar);
    });
});

Шаблон 2: «Помощник по тестированию»

Этот шаблон создает отдельные тесты, но помещает общее тело теста в вспомогательный метод, чтобы его можно было использовать повторно.

function testSomeMethod(foo, bar) {
    assert(subject(foo) == "bar");
}

it("puts the milk in the fridge", function () {
    testSomeMethod("milk", "fridge");
});

it("puts the cereal in the pantry", function () {
    testSomeMethod("cereal", "pantry");
});

ПримерыВыше очень просты, но либо цикл тестирования, либо шаблон вспомогательного теста можно использовать для инкапсуляции гораздо более сложной последовательности шагов (настройка запроса, просмотр некоторых заголовков / тел ответов и т. д.).

...