edit
当前示例,
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();
});
错误
期望(jest.fn())。 被称为。
问题
我正在使用Jest
&amp;Enzyme
测试用React Native
制造的类。该类具有其中的一个函数,当开火时使用链接库来调用canOpenUrl
和openUrl
。我可以在已安装的组件上模拟点击事件,但是我很难知道我可以实际测试多少。
我的目标是检查Linking.canOpenUrl
是否启动了。
exmaple
组件内的功能看起来像这样,
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:无法读取未定义的
的属性'_ismockFunction'
当前代码试图检查此功能是否已释放。使用模拟方法单击的父函数内部,
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
的正确方法是什么?
(因为开玩笑19.0.0 )
您可以使用jest.spyOn()
。
(1)告诉玩笑在模块方法上监视:
const spy = jest.spyOn(Linking, 'canOpenURL');
(2)完成了所有您需要测试的一切后,检查间谍:
expect(spy).toHaveBeenCalled();
(3)清理并停止间谍模块方法
spy.mockReset();
spy.mockRestore();
如果您不希望测试使用方法的实际实现,则可以像这样伪造它们:
jest.spyOn(Linking, 'canOpenURL').mockImplementation(() => Promise.resolve());
函数传递给模拟的位置将是您在调用时要做的任何方法。
参考https://facebook.github.io/jest/docs/en/jest-object.html#jestspyonobject-methodname
使用您的模块方法的实际实现(异步)时,在您测试时可能无法解决承诺。您需要在做出任何断言之前确保在方法实施中解决任何承诺。
一种处理此问题的方法是使用异步/等待,例如:
it('...', async () => {
// Wait for promise to resolve before moving on
await wrapper.instance().onPressLink();
// make your assertions
expect(...);
});
另一个选项是使用expect().resolves
,自Jest 20.0.0以来可用,在该参数期望()在对该值提出主张之前,请在参数期望()中等待某些承诺。
expect(somePromiseThatEventuallyResolvesWithValue).resolves.toBe(Value);
我以最简单的方式完成了:
Spep to Spy:
- 使用开玩笑 制作原始功能的间谍对象
- 使用/没有参数的原始函数调用原始功能
- 主张应用有效参数调用的函数
- 重置模拟
- 还原模拟
这是示例示例
defaultbrowser.ts 是实际的类。
import { Linking } from 'react-native';
export const openDefaultBrowser = async url => {
if (await Linking.canOpenURL(url)) {
Linking.openURL(url);
}
};
defaultbrowser.test.ts 是测试用例类。
import { openDefaultBrowser } from '../DefaultBrowser';
import { Linking } from 'react-native';
describe('openDefaultBrowser with validate and open url', () => {
it('validate url', async () => {
const spy = jest.spyOn(Linking, 'canOpenURL');
openDefaultBrowser('https://www.google.com');
expect(spy).toBeCalledWith('https://www.google.com');
spy.mockReset();
spy.mockRestore();
});
it('open url', async () => {
const spy = jest.spyOn(Linking, 'openURL');
openDefaultBrowser('https://www.google.com');
expect(spy).toBeCalledWith('https://www.google.com');
spy.mockReset();
spy.mockRestore();
});
});
希望这对您有帮助。
it('open url', async () => {
jest.spyOn(Linking, 'canOpenURL')
const spy = jest.spyOn(Linking, 'openURL')
openURL(sitePath)
await waitFor(() => {
expect(spy).toHaveBeenCalledWith(sitePath)
})
spy.mockReset()
spy.mockRestore()
})