【问题标题】:Mock Action functions in Jest testJest 测试中的模拟动作函数
【发布时间】:2015-10-07 18:20:52
【问题描述】:

如何从导入的动作模块调用函数?这是我的组件

class Task extends Component {
 handleClick(e) {
  e.preventDefault();
  Actions.returnTask(this.props.id);
 }
 render() {...}
}

以及如下所示的测试:

jest.dontMock('./Task');
jest.dontMock('./Actions');

describe('Tasks', function() {
 let renderedComponent;
 let mockReturnTask;
 let TaskActions;
 beforeEach(function() {
  renderedComponent = TestUtils.renderIntoDocument(
   <Task task={testTask} key={1} />
    );
   Actions = require('./Actions');
   mockReturnTask = jest.genMockFn();
   Actions.returnTask = mockReturnTask;
  });
  it('should call a returnTask action on Actions', function() {
   renderedComponent.handleClick(event);
   expect(mockReturnTask).toBeCalled();
  });
});

运行我的测试时,它告诉我该函数没有被调用。如果我这样做expect(Actions.returnTask).toBeCalled();,我会收到一条错误消息,指出toBeCalledWith() should be used on a mock function 错误。如何在外部操作上模拟一个函数并检查它是否在我的测试中被调用?我觉得我上面的方法应该可行。

【问题讨论】:

    标签: unit-testing reactjs reactjs-flux jestjs


    【解决方案1】:

    您的示例不包括 Task 的要求,但我很确定这里发生了什么。开玩笑的用户必须知道他们在做什么require 以及什么时候做的。

    按时间顺序:

    1. jest 设置为从不模拟 ActionsTask
    2. Task 组件是必需的,开玩笑真的需要它
    3. Actions 是必需的,因为它在 Task 组件中是必需的。开玩笑真的需要它。
    4. Task 组件被实例化
    5. Actions.returnTask 是猴子补丁,但它不是组件绑定的函数,它是一个仅存在于测试中的新函数。

    要使您的组件使用一个玩笑的模拟函数,您必须在要求 Actions 之前 要求和猴子补丁 Tasks

    请注意,如果您在之后模拟 Actions 的功能,则不必取消模拟 Actions。这正是开玩笑的自动模拟 killing 功能 的用途:删除 jest.dontMock('./Actions'); 和所有对 Actions 模块的引用。测试应该可以正常工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-14
      • 1970-01-01
      • 2018-04-01
      • 1970-01-01
      • 2020-02-29
      相关资源
      最近更新 更多