Я привык писать тесты Mocha с использованием стандартной библиотеки NodeJs утверждать, например:
describe('Some module', () => {
var result = someCall();
it('Should <something>', () => {
assert.ok(...);
});
})
но теперь мой вызов возвращает обещание... поэтому я хочу написать:
describe('Some module', async () => {
var result = await someCall();
it('Should <something>', () => {
assert.ok(...);
});
})
но это не работает. Мои тесты вообще не запускаются. Любопытно,
describe('Some module', async () => {
it('Should <something>', () => {
var result = await someCall();
assert.ok(...);
});
})
работает нормально, но проблема в том, что я хочу сделать один вызов и запустить много тестов для него, поэтому я хочу сделать вызов вне вызовов it()
Как заставить это работать?
и пожалуйста не рекомендуют Chai. Я хочу использовать стандартную библиотеку утверждений



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Хотя использование немного нетрадиционно, одним из подходов может быть использование before() крючок для достижения того, что вам нужно.
Хук before() предоставит средство вызова функциональности (т.е. someCall()) перед остальными тестами в вашем наборе. Сам хук поддерживает выполнение асинхронной функциональности через функцию обратного вызова (например, done), которую можно вызвать после завершения асинхронной функциональности:
before((done) => {
asyncCall().then(() => {
/* Signal to the framework that async call has completed */
done();
});
});
Один из способов интегрировать это с вашим существующим кодом может быть следующим:
describe("Some module", () => {
/* Stores result of async call for subsequent verification in tests */
var result;
/* User before hook to run someCall() once for this suite, and
call done() when async call has completed */
before((done) => {
someCall().then((resolvedValue) => {
result = resolvedValue;
done();
});
});
it("Should <something>", () => {
/* result variable now has resolved value ready for verification */
console.info(result);
});
});
надеюсь, это поможет
@NikKyriakides спасибо за отзыв :-) Изначально я выбрал подход, основанный на async/await, о котором вы упомянули, однако он, похоже, не работает в моей среде (хотя должен был работать), тогда как опубликованное решение сработало. Есть идеи, почему это может быть?
Да, вам нужно вернуть Обещание, если вы не используете done. Поскольку функции async уже возвращают Promise, достаточно просто вернуть asyncCall в before. В этом блоке нет необходимости использовать async/await.
Странно - именно это я и делал изначально. Возможно, завтра мне придется пересмотреть код на моей другой рабочей станции. Спасибо еще раз :)
before принимает функцию async, поэтому вы можете получить result до запуска тестов и использовать ее в своих тестах следующим образом:
const assert = require('assert');
const someCall = () => Promise.resolve('hi');
describe('Some module', () => {
let result;
before(async () => {
result = await someCall();
});
it('Should <something>', () => {
assert.equal(result, 'hi'); // Success!
});
});
Mocha уже поддерживает то, что вы хотите сделать.
Функция Mocha describe не предназначена для асинхронной работы. Однако функция it предназначена для асинхронной работы либо путем передачи обратного вызова done (фактическое имя параметра может быть любым, например «complete», «resolve» или «done»), либо путем возврата обещания, либо путем передачи функции async.
Это означает, что ваш тест почти правильный. Вам просто нужно сделать это вместо этого:
describe('Some module', () => {
it('Should <something>', async () => {
var result = await someCall();
assert.ok(...);
});
})
Если вам нужно запустить функцию someCall() один раз для нескольких блоков it, вы можете сделать, как указано в других ответах, и вызвать ее в блоке before.
Вам не нужно использовать
doneвbefore, еслиasyncCallвозвращаетPromise. Просто вернитеPromise.before(() => { return asyncCall().then(() => { // do some stuff before moving to it }); });Кроме этого +1, я бы тоже использовалbefore.