茉莉花:这个范围

时间:2015-03-17 12:23:14

标签: javascript testing

来自茉莉花文档(http://jasmine.github.io/2.0/introduction.html):

  

此关键字

     

在beforeEach,it和afterEach之间共享变量的另一种方法是通过this关键字。每个规格的beforeEach / it / afterEach都将此作为>同一个空对象,为下一个规范的beforeEach / it / afterEach设置为空。

我在Javascript中对此的理解是,这与实际函数的范围有关。所以我希望它会在beforeEach / it / afterEach中绑定到上下文不同的上下文(取决于函数的上下文)。

e.g。

describe('Spec', function (){
  var eachThis = null;
  beforeEach(function(){
    eachThis = this;
  });
  it('check this', function(){
    except(this).toEqual(eachThis);
  }
};

所以这个测试应该通过。

茉莉花改变了这种行为还是我弄错了?

2 个答案:

答案 0 :(得分:3)

我认为你的例子可能有一些问题,但你认为茉莉在使用thisbeforeEach等时操纵beforeAll引用是正确的。

以下是一个说明性示例 - 请注意,下面列出的所有预期都将通过:

(function() {
  describe("without beforeEach", function () {
    (function() {
      // this is not inside of a beforeEach call
      this.dog = "Spot";
      alert(this.dog);
    })();
    it("should not have access to a dog property from `this`", function () {
        expect(this.dog).toBeUndefined(); // because there is no `dog` member of the object currently referenced by `this`
    });
  });

  describe("a beforeEach test", function () { 
    beforeEach(function () {
        this.dog = "Spot";
    });
    it("should work now because we used `beforeEach`", function () { 
        expect(this.dog).toEqual("Spot");
    });

  });
})();

一般来说,你对这个'在函数范围内定义是正确的,但是jasmine中的这个实现演示了如何提供一个特定的对象来引用这个'这个'关键字,如果你想。在javascript中执行此操作的典型方法是使用Function.prototype.apply(),它允许您传入this引用的任意对象作为函数的第一个参数。

答案 1 :(得分:0)

  

所以这个测试应该通过。

是的,确实如此。

  

茉莉花是否改变了这个

的行为

看起来不像。

  

我做错了什么

您的代码中存在语法错误和拼写错误(例如except - > expect)。


此外,toEqual不会测试对象的身份,因此即使expect(this).toEqual({});也会通过。 toBe是一种更好的方法。