将装饰器设计模式应用于JavaScript代码时出现问题

将装饰器设计模式应用于JavaScript代码时出现问题,javascript,jestjs,Javascript,Jestjs,我有一个名为Calculation的类,我添加了两个函数addOperationToName()和sayOperation(),作为装饰器设计模式的示例。然而,当我使用Jest测试它时,我得到了一个错误“fn不是一个函数”。有人能帮我吗 Calculation.js class Calculation { constructor(a, b, op) { this.a = a; this.b = b; this.op = op; } static Create(a, b,

我有一个名为Calculation的类,我添加了两个函数addOperationToName()和sayOperation(),作为装饰器设计模式的示例。然而,当我使用Jest测试它时,我得到了一个错误“fn不是一个函数”。有人能帮我吗

Calculation.js

class Calculation {
constructor(a, b, op) {
    this.a = a;
    this.b = b;
    this.op = op;
}

static Create(a, b, op){
    return new Calculation(a, b, op);
}

 GetResults() {
    return this.op(this.a,this.b)
}

addOperationToName(fn){
    return function(name){
        const operation = name + ' is a operation';
        fn(operation);
    }
}

sayOperation(name){
    console.log(name);
}
}
module.exports = Calculation;
计算.test.js

const Calculation = require('../src/models/Calculation');

test('Test say name for Product operation', () => {
let op = Product;
let calculation = new Calculation(1,2,op);
let sayTest = calculation.addOperationToName(calculation.sayOperation());
expect(sayTest('Multiply')).toBe('Multiply is an operation');
});

您应该将函数传递给
addOperationTonName
,现在您正在返回函数的结果-只需更改
calculation.addOperationTonName(calculation.sayOperation())
计算.addOperationToName(计算.sayOperation)

类计算{
建造师(a、b、op){
这个a=a;
这个.b=b;
this.op=op;
}
静态创建(a、b、op){
返回新计算(a、b、op);
}
GetResults(){
返回this.op(this.a,this.b)
}
添加操作名(fn){
返回函数(名称){
const operation=name+'是一个操作';
返回fn(操作);
}
}
sayOperation(名称){
console.log(名称);
返回名称;
}
}
let计算=新计算(1,2,空);
设sayTest=calculation.addOperationToName(calculation.sayOperation);

console.log(sayTest('Multiply')=='Multiply是一个操作')
您的意思是引用
计算。sayOperation
?在Jest测试的范围内,
sayOperation
尚未声明,这就是为什么会出现该错误。我确实将其更改为calculation.sayOperation,有一个错误说Undefineddi确实更改了它,但有一个错误说undefinedsee edit-您需要返回
addOperationToName
sayOperation
的结果,以前它只是控制台。记录它