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
相关产品推荐
相关产品推荐

