使用Jest模拟默认导出函数说它没有被调用,但确实如此

时间:2018-02-11 12:48:42

标签: unit-testing mocking react-native-android jestjs

[编辑 - 可能的解决方案]

所以我意识到我的componentWillMount是一个异步方法,因为它使用异步fs包装器来执行fs操作。所以我在beforeEach上编写了async函数参数awaitEnzyme.shallow。这似乎有效。它只是来找我,如果它是异步的,那么当期望被运行时,生命周期还没有运行......你怎么看? 它现在看起来像这样

// root/Meetings/__tests__/MeetingsScreen.test.js
...
import sortMeetings from '../../helpers/sort';
jest.mock('../../helpers/sort', () => jest.fn());

describe('MeetingsScreen', () => {
  let wrapper;
  const mockValueForMeetings = [];
  sortMeetings.mockReturnValue(mockValueForMeetings);

  beforeEach(async () => {
    wrapper = await Enzyme.shallow(<MeetingsScreen />);
  });

  it('should call the sort method', () => {
    expect(sortMeetings).toHaveBeenCalled();
  });
});

[原始问题]

我正在模拟一个导入的函数,测试表明它没有被调用,但它返回了存根值。

我在react-native中有这个类/屏幕导入一个只有一个函数来执行排序的辅助文件。

// root/helpers/sort.js
import moment from 'moment';

const compareDateTime = (a, b) => {
  ...
};

const sortMeetings = meetings => meetings.sort(compareDateTime);

export default sortMeetings;

我的班级看起来像这样

// root/Meetings/MeetingsScreen.js
...
import sortMeetings from '../helpers/sort';


export default class MeetingsScreen extends Component {
  ...

  componentDidMount() {
    this.updateState();
  }

  updateState = async () => {
    const meetingsOnFile = await fsStorage.getItem('meetings'); // this is also stubbed and returns an [{}]
    const meetings = sortMeetings(meetingsOnFile);
    this.setState({ meetings });
  }

  render() {
    return (
      <MeetingList meetings={this.state.meetings} />
    );
  }
}

这是我的考验。我正在使用Jest。

// root/Meetings/__tests__/MeetingsScreen.test.js
...
import sortMeetings from '../../helpers/sort';
jest.mock('../../helpers/sort', () => jest.fn());

describe('MeetingsScreen', () => {
  let wrapper;
  const mockValueForMeetings = [];
  sortMeetings.mockReturnValue(mockValueForMeetings);

  beforeEach(() => {
    wrapper = Enzyme.shallow(<MeetingsScreen />);
  });

  it('should call the sort method', () => {
    expect(sortMeetings).toHaveBeenCalled();
  });
});

所以如果我做对了,因为导入默认函数会在使用Jest时返回一个函数,我正在使用函数进行模拟。在测试之前我设置模拟总是返回一个空数组,我在函数调用后打印出代码(在源代码中),它确实返回一个数组。我也将它改为其他值(即13,[2,3,4],等等),它们都被归还了。所以我假设调用了mock函数。但期望失败了。如果我同时打印sortMeetings.mock,它只会在其值{"calls":[],"instances":[],"timestamps":[]}

中显示空数组

有人能指出我正在做的错误。我想我可能错误的关于导入默认函数如何工作或者Jest如何进行模拟

0 个答案:

没有答案