Cypress导入SAP UI5库类失败,如何忽略该库并模拟方法返回值?
问题描述
我的测试用例代码如下:
import AbstractDao from "ts/data/dao/AbstractDao"; describe("sample Test", () => { it("test method", () => { AbstractDao.getInstance("busyIndicators"); }); });
运行测试时触发Webpack编译错误,原因是AbstractDao依赖SAP UI5库,其导入链为:AbstractDao → sap/ui/model/Model → sap/ui/model/json/JSONModel,导致模块无法解析,错误信息如下:
Error: Webpack Compilation Error Module not found: Error: Can't resolve 'sap/ui/model/json/JSONModel' in 'C:\schedule\time-schedule-application\timeschedule\webapp\data' at Watching.handle [as handler] (C:\Users\MyAcc\AppData\Local\Cypress\Cache\12.17.4\Cypress\resources\app\node_modules\@packages\server\node_modules\@cypress\webpack-preprocessor\dist\index.js:212:23)
我需要让Cypress忽略所有SAP UI5库文件,同时模拟AbstractDao.getInstance("busyIndicators")的返回值。
解决方案
1. 配置Webpack忽略SAP UI5模块
通过修改Cypress的Webpack配置,让编译过程跳过SAP UI5相关模块的解析,有两种常用方式:
方式一:用别名指向空模拟模块
- 在项目中创建空模拟文件,比如
cypress/support/mocks/emptySapModule.js,内容为空即可:
// 空模块,用于占位SAP UI5依赖
- 修改Webpack配置文件(通常为
cypress/webpack.config.js):
const path = require('path'); module.exports = { resolve: { alias: { // 匹配所有sap开头的模块,统一指向空模拟文件 'sap': path.resolve(__dirname, './support/mocks/emptySapModule.js') } } };
方式二:使用null-loader直接忽略
- 安装依赖:
npm install null-loader --save-dev
- 修改Webpack配置:
module.exports = { module: { rules: [ { test: /sap\/.*/, use: 'null-loader' } ] } };
2. 模拟AbstractDao.getInstance的返回值
在测试用例中,使用Cypress内置的cy.stub静态方法,直接模拟目标方法的返回逻辑:
import AbstractDao from "ts/data/dao/AbstractDao"; describe("sample Test", () => { it("test method", () => { // 定义模拟实例,按需添加属性或方法 const mockBusyIndicatorDao = { // 示例属性:isBusy: false // 示例方法:setBusy: () => {} }; // 模拟getInstance方法,仅当传入"busyIndicators"时返回预设实例 cy.stub(AbstractDao, 'getInstance') .withArgs("busyIndicators") .returns(mockBusyIndicatorDao); // 执行测试代码 const result = AbstractDao.getInstance("busyIndicators"); // 断言结果符合预期 expect(result).to.equal(mockBusyIndicatorDao); }); });
内容的提问来源于stack exchange,提问作者Joel
相关产品推荐
相关产品推荐

