Проверьте несколько функций с помощью mocha / chai - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть глобальный объект, который имеет возможность назначать функции для событий, например:

obj.on('event', () => {});

После вызова точного публичного API эти события также запускаются.

Теперь мне нужно написать асинхронные тесты с mocha.js / chai.js и запустить его в среде node.js.

Я застрял в ситуации, когда нужно проверить сразу две подписки на события.

Весь код написан на TypeScript, а затем преобразован в JavaScript.

Код в глобальном объекте:

public someEvent(val1: string, val2: Object) {
 // some stuff here...
 this.emit('event_one', val1);
 this.emit('event_two', val1, val2);
}

Код в тестовом файле (моя последняя реализация):

// prerequisites are here...
describe('test some public API', () => {
 it('should receive a string and an object', (done) => {
  // counting number of succesfull calls
  let steps = 0;

  // function which will finish the test
  const finish = () => {
   if ((++steps) === 2) {
    done();
   }
  };

  // mock values
  const testObj = {
   val: 'test value'
  };

  const testStr = 'test string';

  // add test handlers
  obj.on('event_one', (key) => {
   assert.equal(typeof key, 'string');
   finish();
  });

  obj.on('event_two', (key, event) => {
   assert.equal(typeof key, 'string');
   expect(event).to.be.an.instanceOf(Object);
   finish();
  });

  // fire the event
  obj.someEvent(testStr, testObj);
 });
});

Итак, мой вопрос - есть ли встроенная функциональность, чтобы этот тест выглядел более элегантно?

Другой вопрос: как предоставить некоторую значимую информацию об ошибке вместо строки ошибки по умолчанию?

Ошибка: превышено время ожидания 2000 мс. Для асинхронных тестов и хуков убедитесь, что вызывается «done ()»; если вы возвращаете обещание, убедитесь, что оно разрешено.

1 Ответ

0 голосов
/ 15 сентября 2018

Благодаря комментариям LostJon !

Мое решение - добавить библиотеку sinon.js в проект и использовать sinon.spy.

Решение будет таким:

import * as sinon from 'sinon';

...

// prerequisites are here...
describe('test some public API', () => {
 it('should receive a string and an object', (done) => {
  const spyOne = sinon.spy();
  const spyTwo = sinon.spy();

  // mock values
  const testObj = {
   val: 'test value'
  };

  const testStr = 'test string';

  // add test handlers
  obj.on('event_one', spyOne);
  obj.on('event_two', spyTwo);

  // fire the event
  obj.someEvent(testStr, testObj);

  // assert cases
  assert(spyOne.calledOnce, `'event_one' should be called once`);
  assert.equal(typeof spyOne.args[0][0], 'string');

  assert(spyTwo.calledOnce, `'event_two' should be called once`);
  assert.equal(typeof spyTwo.args[0][0], 'string');
  assert.equal(typeof spyTwo.args[0][1], 'object');
 });
});
...