类型错误:试图将未定义的属性包装为函数

jst*_*all 6 sinon ecmascript-6 babeljs es6-class

下面的例子是简化的。我有一个getter方法:

class MyClass {
  constructor() {}
  get myMethod() {
    return true;
  }
}
Run Code Online (Sandbox Code Playgroud)

这是由 babel 处理的。我想像这样嘲笑它:

var sinon = require('sinon');
var MyClass = require('./MyClass');
var cls = new MyClass();

var stub = sinon.stub(cls, 'myMethod');
stub.returns(function() {
  return false;
});
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误: TypeError: Attempted to wrap undefined property myMethod as function

这发生在 sinon 库的版本 1 和 2 上。

Adi*_*ngh 5

它与您如何定义方法有关myMethod。当你get用来定义一个方法时,它实际上被当作一个属性而不是一个方法。这意味着您可以访问cls.myMethodcls.myMethod()会抛出错误,因为它不是函数

问题

class MyClass {
  constructor() {}
  get myMethod() {
    return true;
  }
}

var cls = new MyClass();
console.log(cls.myMethod())
Run Code Online (Sandbox Code Playgroud)

解决方案 您必须更新您的类定义以将其myMethod视为如下所示的函数

class MyClass {
  constructor() {}
  myMethod() {
    return true;
  }
}

var cls = new MyClass();
console.log(cls.myMethod())
Run Code Online (Sandbox Code Playgroud)

现在有了这个改变,你sinon.stub应该可以正常工作

  • 我知道 getter 被视为财产。但是我无法更改类定义,因为它在很多地方都使用过。我需要一个将吸气剂固定到位的解决方案。 (3认同)