在mocha测试中sinon.test()中的`this`是什么?

时间:2017-08-21 15:54:24

标签: javascript mocha sinon

我的代码:

it('should', sinon.test(function() {
  console.log(this); // what `this` refer here?
  ...
}));

在上面的代码中, this功能中sinon.test()引用了哪些内容?

我尝试记录它,但收到错误:

  

TypeError:将循环结构转换为JSON

Sinon版本:1.17.6

欢迎任何评论。感谢。

更新

看完下面的答案后,我仍然感到困惑。当this.myOnject.log仅存在一次时,为什么以下两段代码有效?

  it('should', sinon.test(function() {
    const stubLog = this.stub(this.myObject.log, 'warn');
    // ...
    this.myObject.process();
    // expect codes...
  }));


  it('should', sinon.test(function() {
    const stubLog = sinon.stub(this.myObject.log, 'warn');
    // ...
    this.myObject.process();
    // expect codes...
  }));

更新

如果投票,请留下一些评论,让我知道你为什么投票。我发布的问题让我很困惑。但是我更加困惑为什么这么多人被投票,但没有留下任何有用的评论。

1 个答案:

答案 0 :(得分:0)

sinon.test为您的测试创建一个新的Sinon sandbox扩充 Mocha通过Sinon特定方法(例如{{}传递给您的测试的正常this对象1}},spy等调用自动创建的沙箱上的相应方法。它增加对象的事实允许您仍然使用Mocha通常在stub上提供的所有Mocha方法,并允许您在任意字段上设置值。测试结束时会自动调用沙箱的this方法。这是一种在测试之间提供隔离的便捷方式,以便对一个测试通过Sinon执行的常见对象的修改不会影响其他测试。

以下是一个例子:

restore

这会产生:

const sinon = require("sinon");

before(function () {
    // We set "moo".
    this.moo = "I'm a cow.";
});

it("test", sinon.test(function () {
    // We can access "stock" Mocha functions.
    this.timeout(0);

    // However, this is augmented with sinon functions.
    const spy = this.spy();
    spy();

    // We can access "moo";
    console.log("value of moo", this.moo);
}));

上面的代码假设Sinon 1.x.在Sinon 2.x及以上value of moo I'm a cow. ✓ test 1 passing (34ms) 不再与Sinon捆绑在一起,但它是独立的package