[编辑 - 可能的解决方案]
所以我意识到我的componentWillMount是一个异步方法,因为它使用异步fs包装器来执行fs操作。所以我在beforeEach
上编写了async
函数参数await
和Enzyme.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如何进行模拟