Как использовать async-await и затем в одном тесте Mocha с готовым? - PullRequest
1 голос
/ 04 апреля 2019

Итак, у меня есть такой тест:

it 'sample test', (done)->
    await Promise.resolve 0
    Promise.resolve 0
    .then ->
        done()
    null

Обратите внимание, что null в конце концов, чтобы избежать возврата Promise. Тем не менее, тест падает с классическим "Error: Resolution method is overspecified. Specify a callback *or* return a Promise; not both"

Я проверил код JS результата, ничего странного:

it('Sample test', async function(done) {
    await Promise.resolve(0);
    Promise.resolve(0).then(function() {
      return done();
    });
    return null;
});

Я не понимаю, что не так, потому что (как мне кажется) этот код не должен возвращать обещание. Кроме того, когда я завернул первое обещание (с await) в setTimeout, оно отлично работает.

it 'working test', (done)->
    setTimeout ->
        await Promise.resolve 0
    , 0
    Promise.resolve 0
    .then ->
        done()
    null

Конечно, с setImmediate вместо setTimeout это тоже работает, так что я думаю, что лекарством в этой ситуации является обратный вызов. Но это очень грязное решение. Как более четко смешать then, async-await и done в одном тесте?

Ответы [ 2 ]

0 голосов
/ 04 апреля 2019

В Mocha v3.0.0 и новее возврат Promise и вызов done() приведет к исключению, так как это, как правило, ошибка - docs

Так как async function всегда возвращайте Promise вы получаете эту ошибку.Возможные решения:

  • Удалить async function

    it('Sample test', function(done) {
        Promise.resolve(0)
            .then(function() {
                ...
            })
            .then(function() {
                ... // if necessary
            }) 
            .then(function() {
                done();
            });
    });
    
  • Возврат Promise

    it('Sample test', function() {
        return Promise.resolve(0)
            .then(function() {
                ...
            })
            .then(function() {
                ... // if necessary
            });
    });
    
  • Использование async/await

    it('Sample test', async function() {
       await Promise.resolve(0);
       await Promise.resolve(0);
    });
    
0 голосов
/ 04 апреля 2019

Использование await в теле функции превращает функцию проверки в функцию async.

async функции всегда возвращают Promise.

Таким образом, в этом случае:

it('Sample test', async function(done) {
    await Promise.resolve(0);
    Promise.resolve(0).then(function() {
      return done();
    });
    return null;
});

... тестовая функция возвращает Promise, который преобразуется в null.


В другом примере Mocha нене жалуйтесь, потому что код компилируется следующим образом:

it('working test', function(done) {
  setTimeout(async function() {
    return (await Promise.resolve(0));
  }, 0);
  Promise.resolve(0).then(function() {
    return done();
  });
  return null;
});

..., поскольку await теперь находится в теле функции, переданной в setTimeout.

(обратите внимание, чтодва теста ведут себя очень по-разному ).


Нет причин использовать обе функции: done и async / await (или функцию, которая возвращает Promise) поэтому Mocha не проходит тест с этой ошибкой.

Ваш первый тест можно упростить до этого:

it 'sample test', ()->
    await Promise.resolve 0
    await Promise.resolve 0

... или если вам нужно выполнить работу в then цепочкеко второму Promise вы можете просто сделать это:

it 'sample test', ()->
    await Promise.resolve 0
    await Promise.resolve 0
    .then ->
        // do stuff here
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...