如何使用 Jest 测试 Reflux 动作

Posted

技术标签:

【中文标题】如何使用 Jest 测试 Reflux 动作【英文标题】:How to test Reflux actions with Jest 【发布时间】:2015-04-12 08:17:52 【问题描述】:

我在测试 Reflux 操作是否在我的应用程序中正确触发时遇到了困难,实际上它们似乎根本不适用于 Jest。我有这个示例测试:

jest.autoMockOff();

describe('Test', function () 
  it('Tests actions', function () 
    var Reflux = require('../node_modules/reflux/index');

    var action = Reflux.createAction('action');
    var mockFn = jest.genMockFn();

    var store = Reflux.createStore(
      init: function () 
        this.listenTo(action, this.onAction);
      ,
      onAction: function () 
        mockFn();
      
    );

    action('Hello World');
    expect(mockFn).toBeCalled();
  );
);

哪些输出:

● Test › it Tests actions
  - Expected Function to be called.
    at Spec.<anonymous> (__tests__/Test.js:20:20)
    at Timer.listOnTimeout [as ontimeout] (timers.js:112:15)

即使使用 Jasmine 异步函数,它似乎也不起作用

jest.autoMockOff();

describe('Test', function () 
  it('Tests actions', function () 
    var Reflux = require('../node_modules/reflux/index');

    var action = Reflux.createAction('action');
    var mockFn = jest.genMockFn();

    var flag = false;

    var store = Reflux.createStore(
      init: function () 
        this.listenTo(action, this.onAction);
      ,
      onAction: function () 
        mockFn();
        flag = true;
      
    );

    runs(function () 
      action();
    );

    waitsFor(function () 
      return flag;
    , 'The action should be triggered.', 5000);

    runs(function () 
      expect(mockFn).toBeCalled();
    );
  );
);

给我...

FAIL  __tests__/Test.js (6.08s)
● Test › it Tests actions
  - Throws: [object Object]

有人做过吗?

【问题讨论】:

【参考方案1】:

我想通了!我只需要使用 Jest 自己的方法来快进任何计时器。即只需添加行

jest.runAllTimers();

所以我的第一个例子的工作版本是

jest.autoMockOff();

describe('Test', function () 
  it('Tests actions', function () 
    var Reflux = require('../node_modules/reflux/index');

    var action = Reflux.createAction('action');
    var mockFn = jest.genMockFn();

    var store = Reflux.createStore(
      init: function () 
        this.listenTo(action, this.onAction);
      ,
      onAction: function () 
        mockFn();
      
    );

    action('Hello World');

    jest.runAllTimers();

    expect(mockFn).toBeCalled();
  );
);

【讨论】:

以上是关于如何使用 Jest 测试 Reflux 动作的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Jest 模拟对象中的特定函数?

如何使用 Promise.all 使用 jest 为多个提取设置测试

ReactJS:如何在 Jest 中通过动作触发减速器

如何使用 Vue-test-utils 和 Jest 测试 Vuex 突变

如何在 Jest 的自定义测试环境文件中使用 TypeScript?

用 jest 测试 redux 异步动作创建者