使用Sinon

时间:2016-09-02 23:44:09

标签: javascript typescript sinon

  • Sinon版本:v2.0.0-pre.2
  • 环境:Windows 10
  • 您正在使用的其他图书馆:打字稿,巴贝尔,摩卡,柴

您期望发生什么?

我希望能够在类中存根箭头函数。

实际发生的事情

我不能存根箭头功能,但是,我可以存根类原型功能。

FAILED TESTS:
  ExampleClass tests
    × should stub thisDoesntWork arrow function
      Chrome 52.0.2743 (Windows 10 0.0.0)
    TypeError: Attempted to wrap undefined property thisDoesntWork as function
        at wrapMethod (webpack:///~/sinon/pkg/sinon.js:3138:0 <- test-bundler.js:7377:21)
        at Object.stub (webpack:///~/sinon/pkg/sinon.js:2472:0 <- test-bundler.js:6711:12)
        at Context.<anonymous> (webpack:///src/stores/sinon.test.ts:22:51 <- test-bundler.js:96197:72)

如何重现

export class ExampleClass {
    thisWorks() {
        return 0;
    }

    thisDoesntWork = () => {
        return 0;
    }
}

describe("ExampleClass tests", () => {
    it("should stub thisWorks function", () => {
        let stubFunctionA = sinon.stub(ExampleClass.prototype, "thisWorks");
    });
    it("should stub thisDoesntWork arrow function", () => {
        let stubFunctionB = sinon.stub(ExampleClass, "thisDoesntWork");
    });
});

1 个答案:

答案 0 :(得分:3)

我从未使用过sinon,但在他们的文档中,它为sinon.stub函数说明了它:

  

用stub函数替换object.method

如果查看ExampleClass的编译后的js代码:

var ExampleClass = (function () {
    function ExampleClass() {
        this.thisDoesntWork = function () {
            return 0;
        };
    }
    ExampleClass.prototype.thisWorks = function () {
        return 0;
    };
    return ExampleClass;
}());

然后您会看到ExampleClass.prototype.thisWorks已定义,但没有ExampleClass.thisDoesntWork定义,甚至没有ExampleClass.prototype.thisDoesntWork

仅在构造函数中添加thisDoesntWork方法(箭头函数实际上不是类方法,它们只是具有函数类型的类成员)。

我怀疑这会奏效:

describe("ExampleClass tests", () => {
    it("should stub thisDoesntWork arrow function", () => {
        let stubFunctionB = sinon.stub(new ExampleClass(), "thisDoesntWork");
    });
});