关于withExponents Mixin的导出、导入与测试适配问题求助
我来帮你搞定这个问题!你的代码主要有两个核心问题:Mixin的调用逻辑不对,以及导出导入的配置没踩对路子。咱们一步步来修正:
问题分析与完整修正方案
1. 修复Mixin的实现逻辑
你的withExponents当前是返回一个新对象,但你在测试里用withExponents.call(calculator)的方式完全没发挥作用——因为call只是改变函数内部的this指向,但你的函数根本没用到this,也没把方法挂载到传入的实例上。我们需要修改Mixin,让它直接把方法添加到目标对象上:
// withExponents.js const withExponents = function (obj) { // 直接把方法挂载到传入的obj实例上,而不是返回新对象 Object.assign(obj, { pow(num1, num2) { return Math.pow(num1, num2); }, multiplyExp(array1, array2) { return Math.pow(...array1) * Math.pow(...array2); }, divideExp(array1, array2) { return Math.pow(...array1) / Math.pow(...array2); } }); // 可选:返回obj方便链式调用 return obj; } // CommonJS环境(比如Node.js/Mocha测试)的正确导出方式 module.exports = withExponents; // 如果是ES模块环境(用import/export),改成下面这样: // export default function withExponents(obj) { // Object.assign(obj, { /* 方法同上 */ }); // return obj; // }
2. 修正测试文件的导入与调用
首先得确保你测试里用到的Calculator类是存在的(你之前的测试里直接用了但没定义),然后正确导入Mixin并调用:
CommonJS环境示例(比如Mocha测试):
// calculator.test.js const withExponents = require('./withExponents'); // 先定义你的Calculator类(空类也可以,或者加基础计算方法) class Calculator {} describe("withExponents", function() { var calculator; beforeEach(function() { calculator = new Calculator(); // 直接把实例传入Mixin,完成方法挂载 withExponents(calculator); }); it("returns 2^3", function() { expect(calculator.pow(2, 3)).to.equal(8); }); it("multiplies 2^3 and 2^4", function() { expect(calculator.multiplyExp([2, 3], [2, 4])).to.equal(128); }); it("divides 2^3 by 2^5", function() { expect(calculator.divideExp([2, 3], [2, 5])).to.equal(0.25); }); });
ES模块环境示例:
把导入语句改成import withExponents from './withExponents.js';,其余逻辑完全一致。
3. 踩坑复盘:为什么原代码跑不通?
- 原Mixin返回新对象,但你用
withExponents.call(calculator)时,既没给函数传obj参数,也没把返回的新对象赋值给calculator,导致原实例根本没拿到那些方法。 - 导出时
module.exports = withExponents是正确的,绝对不能加括号——加括号会变成立即执行函数,导出的是函数执行结果而非函数本身,这大概率是你之前尝试时的坑点。
现在运行测试应该就能全部通过了!
内容的提问来源于stack exchange,提问作者333Matt
相关产品推荐
相关产品推荐

