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

时间:2021-02-27 22:11:31

标签: javascript jestjs

我有一个名为 Calculation 的类,我添加了两个函数 addOperationToName() 和 sayOperation() 作为装饰器设计模式的示例。但是,当我使用 Jest 对其进行测试时,出现“fn 不是函数”的错误。有人可以帮我吗?

计算.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;

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');
});

1 个答案:

答案 0 :(得分:1)

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

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';
            return fn(operation);
        }
    }

    sayOperation(name){
        console.log(name);
        return name;
    }
}

let calculation = new Calculation(1,2,null);
let sayTest = calculation.addOperationToName(calculation.sayOperation);
console.log(sayTest('Multiply') === 'Multiply is a operation')