【问题标题】:Testing with Jest mock用 Jest 模拟测试
【发布时间】:2018-10-07 04:24:27
【问题描述】:

我在我的应用程序中使用 Flux 设计模式,我需要测试应用程序操作是否在组件发送的有效负载中的给定 Store 上发出。

使用 Dispatcher 我发送如下有效负载:

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);

【问题讨论】:

    标签: javascript jestjs flux


    【解决方案1】:

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

    我在这里找到了这个Understanding Jest Mocks

    我更改了我的测试代码(这种测试更简洁且正确的方法)

      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);
    

    【讨论】:

      猜你喜欢
      • 2021-08-27
      • 2021-12-10
      • 2019-10-01
      • 1970-01-01
      • 2019-09-01
      • 2021-10-13
      • 2020-12-10
      • 2020-05-28
      • 2021-08-08
      相关资源
      最近更新 更多