Тестирование с шуткой - PullRequest
       8

Тестирование с шуткой

0 голосов
/ 07 октября 2018

Я использую шаблон проектирования Flux в своем приложении, и мне нужно проверить, что действие приложения испускается в данном хранилище в полезной нагрузке, которую отправляет компонент.

Используя диспетчер, я отправляю полезную нагрузку, какследующее:

dispatcher.dispatch({
  action: ACTION_NAME,
  foo: 'bar',
  emitOn: {
   store: SomeStore, // extends EventEmitter
   componentIds: ['Foo-Bar']
  }
}

Диспетчер реализован следующим образом (не обязательно важно)

Dispatcher.register((payload) => {
 Actions.call(payload);
 return true;
});

Когда диспетчер calls действие, объект Actions вызовет это действие икогда действие заканчивается, оно должно вызвать emit в данном магазине.

Мой вопрос: как мне проверить это в моем приложении?Я хочу знать, возможно ли проверить, что emit был вызван после завершения действия.

Чтобы завершить действие, эта функция называется Actions.finish(payload)

И если вам интересно, как выглядит finish:

  finish(payload) {
    payload.emitOn.map(emitter => {
      var store = emitter.store;
      emitter.componentIds.map(id => {
        store.emit(id);
      });
    });
  }

Мой текущий код тестирования,но Ошибка никогда не выдается:

  jest.mock('./TestStore.js', () => {
    return function() {
      return {
        emit: () => {
          throw new Error('Test Error');
        }
      };
    };
  });

  let ACTION = 'Test-Action';
  let payload = {
    action: ACTION,
    emitOn: [{
      store: TestStore, // The store to emit on
      componentIds: ['Test-Id']
    }]
  };

  expect(() => {
    AppActions.finish(payload);
  }).toThrow(Error);

1 Ответ

0 голосов
/ 07 октября 2018

Так что для всех, кто заботится о том, как проверить, вызвана ли функция, вы можете шпионить за функцией, используя jest.spyOn

Я нашел это здесь Понимание шуток

Я изменил свой код тестирования (намного чище и правильный подход к этому виду тестирования)

  const emitMock = jest.spyOn(TestStore, 'emit');

  let ACTION = 'Test-Action';
  let payload = {
    action: ACTION,
    emitOn: [{
      store: TestStore, // The store to emit on
      componentIds: ['Test-Id']
    }]
  };

  AppActions.finish(payload);

  expect(emitMock).toHaveBeenCalledTimes(1);
...