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

Jasmine中如何模拟导入的类模块,替换MyModule的依赖实例?

解决模块类依赖的模拟问题

首先先修正你代码中的几处语法错误,否则代码无法正常运行:

修正后的原文件

dependency.js

function Dependency(property) {
    this.property = property;
}

Dependency.prototype.doSomething = function () {
    console.log('inside doSomething property: ', this.property);
}

export default Dependency;

myModule.js

import Dependency from './Dependency.js';

function MyModule () {
   this.dependency = new Dependency('Some Property');
}

MyModule.prototype.init = function () {
    this.dependency.doSomething();
}

export default MyModule;

解决方案

方案一:依赖注入(推荐,代码更易测试)

修改MyModule的构造函数,允许传入自定义的Dependency实例,测试时直接传入spy对象即可,无需mock模块:

修改后的myModule.js

import Dependency from './Dependency.js';

function MyModule (customDependency) {
   // 传入自定义实例则使用它,否则创建默认实例
   this.dependency = customDependency || new Dependency('Some Property');
}

MyModule.prototype.init = function () {
    this.dependency.doSomething();
}

export default MyModule;

测试文件myModule-test.js

import MyModule from '../myModule';
import Dependency from '../dependency';

describe('MyModule', () => {
  it('doSomething on the dependency called on init', () => {
    // 创建带有spy方法的假Dependency实例
    const dependencySpy = jasmine.createSpyObj('Dependency', ['doSomething']);
    
    // 传入假实例创建MyModule
    const myModule_ = new MyModule(dependencySpy);
    myModule_.init();

    // 验证spy方法被调用
    expect(dependencySpy.doSomething).toHaveBeenCalled();
  });
});

方案二:Mock模块的构造函数

如果不想修改原代码,可以通过Jasmine的spy功能,替换Dependency的构造行为,让new Dependency()返回假对象:

测试文件myModule-test.js

import MyModule from '../myModule';
import Dependency from '../dependency';

describe('MyModule', () => {
  it('doSomething on the dependency called on init', () => {
    // 创建带有spy方法的假实例
    const dependencySpy = jasmine.createSpyObj('Dependency', ['doSomething']);
    
    // 监视Dependency构造函数,让它返回假实例
    // 注意:如果是ES模块环境,需确保模块导出的Dependency可被替换,或挂载在全局对象上
    spyOn(window, 'Dependency').and.returnValue(dependencySpy);

    const myModule_ = new MyModule();
    myModule_.init();

    // 验证假实例的方法被调用
    expect(dependencySpy.doSomething).toHaveBeenCalled();
  });
});

若使用Node.js环境或Jest框架,可通过jest.mock更便捷地mock整个模块:

import MyModule from '../myModule';
import Dependency from '../dependency';

// Mock整个Dependency模块
jest.mock('../dependency', () => {
  return jest.fn().mockImplementation(() => {
    return { doSomething: jest.fn() };
  });
});

describe('MyModule', () => {
  it('doSomething on the dependency called on init', () => {
    const myModule_ = new MyModule();
    myModule_.init();

    // 获取构造出的假实例,验证方法被调用
    const mockDependencyInstance = Dependency.mock.instances[0];
    expect(mockDependencyInstance.doSomething).toHaveBeenCalled();
  });
});

内容的提问来源于stack exchange,提问作者3960278

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 11:35:20