Mocha.js 如何监视动态调用的函数

Mocha.js 如何监视动态调用的函数,mocha.js,chai,sinon,Mocha.js,Chai,Sinon,我正在使用Javascript、Mocha、Chai和SinonJs。我想做的是监视另一个方法“compareUsingOperator”动态调用的方法“equals”。下面的代码显示了我的类“StringComparator”,其中包含两个方法“equals”和“CompareSingOperator” 在我的单元测试中,我在“equals”方法上设置了一个间谍,如下所示: sinon.spy(actual, "equals"); private compareFunctionList: {

我正在使用Javascript、Mocha、Chai和SinonJs。我想做的是监视另一个方法“compareUsingOperator”动态调用的方法“equals”。下面的代码显示了我的类“StringComparator”,其中包含两个方法“equals”和“CompareSingOperator”

在我的单元测试中,我在“equals”方法上设置了一个间谍,如下所示:

sinon.spy(actual, "equals");
private compareFunctionList: {[key in "=" | "!=" | "<>" | "<" | "<=" | ">" | ">="]: string};

    public constructor() {
        this.compareFunctionList = {
            "=" : "equals",
            "!=" : "notEquals",
            "<>" : "notEquals",
            "<" : "lessThan"
            "<=" : "lessThanOrEquals",
            ">" : "greaterThan",
            ">=" : "greaterThanOrEquals",
        };
    }
“actual”是“StringComparator”的一个实例

下一步我要打电话:

actual.compareUsingOperator("=", comparator.value1, comparator.value2);
在此方法中,执行以下代码:

const fn: Function = this.compareFunctionList[operator];
        return fn.call(this, value1, value2);
这是对“equals”方法的调用。这也是我的问题。我想知道是否叫“等于”。我使用以下断言:

assert.called(actual.equals);
我从chai/sinon那里得到的回答是:

AssertError: expected equals to have been called at least once but was never called
预期的行为应该是绿色测试

我的单元测试有什么问题?在console.log的帮助下,我可以证明已经调用了“equals”

问候


弗洛里安我自己找到了答案。我必须替换:

   const fn: Function = this.compareFunctionList[operator];
   return fn.call(this, value1, value2);
与:

这是:

private compareFunctionList: {[key in "=" | "!=" | "<>" | "<" | "<=" | ">" | ">="]: Function};

    public constructor() {
        this.compareFunctionList = {
            "=" : this.equals,
            "!=" : this.notEquals,
            "<>" : this.notEquals,
            "<" : this.lessThan,
            "<=" : this.lessThanOrEquals,
            ">" : this.greaterThan,
            ">=" : this.greaterThanOrEquals,
        };
    }
private compareFunctionList:{[输入“=”|“!=”|“;”|“=”]:函数};
公共构造函数(){
this.compareFunctionList={
“=”:this.equals,
“!=”:this.notEquals,
“”:this.notEquals,
“=”:此值大于或等于,
};
}
就像这样:

sinon.spy(actual, "equals");
private compareFunctionList: {[key in "=" | "!=" | "<>" | "<" | "<=" | ">" | ">="]: string};

    public constructor() {
        this.compareFunctionList = {
            "=" : "equals",
            "!=" : "notEquals",
            "<>" : "notEquals",
            "<" : "lessThan"
            "<=" : "lessThanOrEquals",
            ">" : "greaterThan",
            ">=" : "greaterThanOrEquals",
        };
    }
private compareFunctionList:{[输入“=”|“!=”|“=”]:string};
公共构造函数(){
this.compareFunctionList={
“=”:“等于”,
“!=”:“notEquals”,
“”:“notEquals”,
“=”:“大于或等于”,
};
}
现在这个类是可测试的

坦克和问候

弗洛里安

private compareFunctionList: {[key in "=" | "!=" | "<>" | "<" | "<=" | ">" | ">="]: string};

    public constructor() {
        this.compareFunctionList = {
            "=" : "equals",
            "!=" : "notEquals",
            "<>" : "notEquals",
            "<" : "lessThan"
            "<=" : "lessThanOrEquals",
            ">" : "greaterThan",
            ">=" : "greaterThanOrEquals",
        };
    }