用Jest模拟测试

时间:2018-10-07 04:24:27

标签: javascript jestjs flux

我在我的应用程序中使用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 :(得分:0)

对于任何关心如何测试函数是否调用的人,您都可以使用gitlab.rb监视函数

我在这里Understanding Jest Mocks

我更改了测试代码(更清洁,并且是进行此类测试的正确方法)

jest.spyOn