编辑
当前示例,
it('CALLED THE canOpenURL FUNCTION', () => {
const wrapper = mount(<ResourceCardComponent {...mockProps} />);
const canOpenURLSpy = jest.spyOn(Linking, 'canOpenURL');
wrapper.find('TouchableOpacity').simulate('click');
expect(canOpenURLSpy).toHaveBeenCalled();
canOpenURLSpy.mockReset();
canOpenURLSpy.mockRestore();
});
错误
expect(jest.fn()).toHaveBeenCalled() Expected mock function to have been called.
问题
我正在使用 Jest
和 Enzyme
来测试用 React Native
制作的类。此类内部有一个函数,当被触发时使用链接库调用 canOpenUrl
和 openUrl
。我可以在安装的组件上模拟点击事件,但我不知道我可以实际测试多少。
我的目标是检查 Linking.canOpenUrl
是否触发。
例子
组件内部的函数是这样的,
onPressLink() {
console.log('HEY THIS FUNCTION FIRED WOOT WOOT');
Linking.canOpenURL(this.props.url).then((supported) => {
if (supported) {
Linking.openURL(this.props.url);
}
});
}
我可以像这样模拟发射,
describe('onPressLink has been called!', () => {
it('It clicks the mock function onPressLink!', (done) => {
const wrapper = mount(<MyComponent {...mockProps} />);
const onPressLink = jest.fn();
const a = new onPressLink();
wrapper.find('TouchableOpacity').first().simulate('click');
expect(onPressLink).toHaveBeenCalled();
done();
});
});
现在确实可行,但我的目标是使用类似这样的东西,
expect(Linking.canOpenUrl).toHaveBeenCalled();
但我一直收到这个错误,
TypeError: Cannot read property '_isMockFunction' of undefined
当前代码正在尝试检查此函数是否曾被触发。在用模拟方法点击的父函数里面,
it('calls canOpenURL', () => {
const wrapper = mount(<MyComponent {...mockProps} />);
const canOpenURL = jest.spyOn(wrapper.instance, 'onPressLink');
wrapper.find('TouchableOpacity').simulate('click');
expect('Linking.canOpenUrl').toHaveBeenCalled();
});
问题
检查 Linking.canOpenURL
在其父函数执行时是否被触发的正确方法是什么?
最佳答案
(自 Jest 19.0.0+ 起)
您可以使用 jest.spyOn()
监视链接模块方法。
(1) 让jest监视模块方法:
const spy = jest.spyOn(Linking, 'canOpenURL');
(2) 完成所有测试后,检查 spy :
expect(spy).toHaveBeenCalled();
(3) 清理并停止监视模块方法
spy.mockReset();
spy.mockRestore();
如果您不希望测试使用方法的实际实现,您可以像这样伪造它们:
jest.spyOn(Linking, 'canOpenURL').mockImplementation(() => Promise.resolve());
传递给 mockImplementation 的函数将是您希望该方法在调用时执行的任何操作。
引用 https://facebook.github.io/jest/docs/en/jest-object.html#jestspyonobject-methodname
当使用异步的模块方法的实际实现时,promise 可能在您测试它时尚未解决。在对其进行任何断言之前,您需要确保在您的方法实现中解决了任何 promise 。
处理此问题的一种方法是使用 async/await,如下所示:
it('...', async () => {
// Wait for promise to resolve before moving on
await wrapper.instance().onPressLink();
// make your assertions
expect(...);
});
另一种选择是使用 expect().resolves
,available since Jest 20.0.0 ,在对那个值做出断言之前,你等待 expect() 的参数中的一些 promise 用一个值来解析。
expect(somePromiseThatEventuallyResolvesWithValue).resolves.toBe(Value);
关于react-native - 在 React Native 中使用 Jest 测试在对象上调用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47802886/