集成videojs-cmcd后单元测试报错:videojs__default.default.getPlugin is not a function
解决方案:Video.js + videojs-cmcd 单元测试报错及类型缺失问题
一、解决TypeError: videojs__default.default.getPlugin is not a function测试错误
1. 导入完整的Video.js构建版本
测试环境可能默认导入了精简版Video.js,缺失插件系统相关API,修改导入语句为完整构建包:
import videojs from 'video.js/dist/video.js';
2. 手动模拟Video.js插件API
在测试前置文件(如setupTests.ts)中补全测试环境缺失的方法:
import videojs from 'video.js'; // 模拟插件系统所需的核心方法 if (!videojs.getPlugin) { videojs.getPlugin = jest.fn(() => null); videojs.registerPlugin = jest.fn(); }
3. Mock videojs-cmcd插件模块
测试时无需加载真实插件逻辑,直接mock整个模块:
// 在测试文件顶部添加 jest.mock('@montevideo-tech/videojs-cmcd', () => jest.fn());
或者在Jest配置文件的moduleNameMapper中配置全局mock:
{ "moduleNameMapper": { "@montevideo-tech/videojs-cmcd": "<rootDir>/__mocks__/videojs-cmcd.js" } }
然后在__mocks__/videojs-cmcd.js中写入:
module.exports = jest.fn();
二、处理videojs-cmcd缺少@types类型定义的问题
1. 创建自定义类型声明文件
在项目src目录下新建types/videojs-cmcd/index.d.ts,添加适配插件的类型定义:
import videojs from 'video.js'; declare module '@montevideo-tech/videojs-cmcd' { // 根据插件实际功能补充配置项字段 export interface CMCDPluginOptions { sessionId?: string; contentId?: string; streamType?: 'v' | 'a' | 'av'; } // 扩展Video.js Player接口,添加cmcd方法 declare module 'video.js' { interface Player { cmcd: (options?: CMCDPluginOptions) => void; } } }
接着修改tsconfig.json,将自定义类型目录加入typeRoots:
{ "compilerOptions": { "typeRoots": ["./src/types", "./node_modules/@types"] } }
2. 临时忽略类型错误(应急方案)
如果暂时不需要完整类型支持,可在导入插件的行添加注释跳过TS检查:
// @ts-ignore import '@montevideo-tech/videojs-cmcd';
内容的提问来源于stack exchange,提问作者Mahes
相关产品推荐
相关产品推荐

