You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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相关模块的解析,有两种常用方式:

方式一:用别名指向空模拟模块

  1. 在项目中创建空模拟文件,比如cypress/support/mocks/emptySapModule.js,内容为空即可:
// 空模块,用于占位SAP UI5依赖
  1. 修改Webpack配置文件(通常为cypress/webpack.config.js):
const path = require('path');

module.exports = {
  resolve: {
    alias: {
      // 匹配所有sap开头的模块,统一指向空模拟文件
      'sap': path.resolve(__dirname, './support/mocks/emptySapModule.js')
    }
  }
};

方式二:使用null-loader直接忽略

  1. 安装依赖:
npm install null-loader --save-dev
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 11:22:41