将装饰器设计模式应用于JavaScript代码时出现问题
我有一个名为Calculation的类,我添加了两个函数addOperationToName()和sayOperation(),作为装饰器设计模式的示例。然而,当我使用Jest测试它时,我得到了一个错误“fn不是一个函数”。有人能帮我吗 Calculation.js将装饰器设计模式应用于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,
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
的结果,以前它只是控制台。记录它