Как структурировать тесты для асинхронных функций? - PullRequest
4 голосов
/ 19 марта 2019

Я привык писать тесты Mocha, используя стандартную библиотеку NodeJs assert , например:

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 (), звонки

Как мне заставить это работать?

и пожалуйста не рекомендую Чай.Я хочу использовать стандартную библиотеку assert

Ответы [ 3 ]

3 голосов
/ 19 марта 2019

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!
  });
});
3 голосов
/ 19 марта 2019

Хотя использование немного необычно, один из подходов может заключаться в использовании before() hook для достижения того, что вам нужно.

Хук 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.log(result);
  });
});

Надеюсь, это поможет

1 голос
/ 19 марта 2019

Mocha уже поддерживает то, что вы хотите сделать.

Функция Mocha describe не предназначена для асинхронной работы.Тем не менее, функция it предназначена для асинхронной работы путем передачи обратного вызова done (фактическое имя параметра может быть любым, например, «завершено» или «разрешить» или «выполнено»), возвращая обещание или передавая async функция.

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

describe('Some module', () => {
   it('Should <something>', async () => {
      var result = await someCall();
      assert.ok(...);
   });
})

Если вам нужно запустить функцию someCall() один раз для нескольких блоков it, вы можете сделать это, как указано в других ответах, и вызвать его в before блок.

...