模拟操作在Jest测试中起作用

时间:2015-10-07 18:20:52

标签: unit-testing reactjs reactjs-flux jestjs

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

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错误的错误消息。如何模拟外部Actions上的函数并检查它是否在我的测试中被调用?我觉得上面的方法应该有效。

1 个答案:

答案 0 :(得分:1)

您的示例并未包含Task的要求,但我非常确定此处发生的事情。 Jest用户必须知道他们做什么require以及何时做。

按时间顺序:

  1. jest设置为永不模拟ActionsTask
  2. Task组件是必需的,jest要求它真实
  3. Actions是必需的,因为Task组件中需要它。开玩笑要求它真实。
  4. Task组件已实例化
  5. Actions.returnTask是猴子修补但它不是组件与绑定的功能,它是一个仅存在于测试中的新功能。
  6. 要使用jest模拟功能制作您的组件,您必须在需要Actions

    之前要求并修补Tasks

    请注意,如果您在之后模拟了Actions的功能,则不必取消Actions。它正是为自己模拟的查杀功能所做的:删除jest.dontMock('./Actions');以及对Actions模块的所有引用。测试应该有效。