网站搜索

javascript - 使用 Jest 时,类型为 '"openURL"' 的参数不能分配给类型为 'never' 的参数


我在 Jest 中是初学者,这些是定义的类。APIService 类没有被导出;只定义了 openURL 函数。

API服务.ts

    export const openURL = async (openURL : string) => {
    await Linking.openURL(openURL );
};

注册页面.tsx

import{openURL} from '../APIService';

RegistrationPage.test.ts

test('should call function openURL with empty value', async () => {
const url = '';
const mockOpenURL = jest.fn();
mockOpenURL .mockImplementation(() => Promise.resolve(''));
const openURLSpy = jest.spyOn(openURL, 'openURL');
const mockURL = await openURL(url);
expect(mockOpenURL).toBeCalled();
expect(mockURL).toEqual(url);
expect(mockOpenURL).toHaveBeenCalledWith(url);
openURLSpy.mockRestore();

});

根据我的理解编写了这个函数,可能存在漏洞,因为没有正确地使用 mock 或 spy 来运行它,导致使用 Jest 时出现错误:类型为 '"openURL"' 的参数不能赋值给类型为 'never' 的参数

对改进此测试用例的建议将会很有帮助。

答案#1

仅仅在本地定义一个变量,比如 const mockOpenURL=jest.fn() 并不能模拟任何东西。

jest.spyOn(openURL, 'openURL') 失败,因为 openURL 是一个函数,并且没有 openURL.openURL 属性。

需要被模拟的是APIService模块:

import{openURL} from '../APIService';
jest.mock('../APIService', () => {
  return {
    __esModule: true,
    openURL: jest.fn()
  }
};
...
openURL.mockResolvedValue();
// code that calls openURL

答案#2

谢谢 @ jest.mock('../APIService.ts',() => { return { __esModule: true, openURL: jest.fn(), }; });

test('openURL function to be called with', async () => {
    const openURL = 'www.google.com';
    const openURL = jest.fn();
    openURL.mockReturnValue(openURL );
  });