不带括号的Javascript向后感知链接,例如expect(x).not.toBe()

不带括号的Javascript向后感知链接,例如expect(x).not.toBe(),javascript,jasmine,getter,chaining,brackets,Javascript,Jasmine,Getter,Chaining,Brackets,今天我想用类似于Jasmine的方式做一些链接: Jasmine编写测试条件的风格非常流畅,例如: expect(result).not.toBe(85); 在我的测试中,我只想添加一个和作为糖衣,其作用如下: createRegion('test').and.append() 因此,这非常简单(我知道以下内容在IE8中不起作用这里是我想出的一种方法,但是如果你有很多方法,你会希望使用getter而不是复制: function expect(ob){ var resp={}; fu

今天我想用类似于Jasmine的方式做一些链接:

Jasmine编写测试条件的风格非常流畅,例如:

expect(result).not.toBe(85);
在我的测试中,我只想添加一个
作为糖衣,其作用如下:

createRegion('test').and.append()

因此,这非常简单(我知道以下内容在IE8中不起作用这里是我想出的一种方法,但是如果你有很多方法,你会希望使用getter而不是复制:

function expect(ob){
  var resp={};

  function not(fn){return function(){return !fn.apply(resp, arguments)}; }

  resp.toBe=function(val){;
      return val==ob; 
  };


  var n=resp.not=function(){};

  for(var i in resp){
     var v=resp[i];
     if(v.call){ n[i]=not(v); }
  }

  return resp;
}

// try it out on a number:
var x=123;

expect(x).not.toBe(123); // false
expect(x).not.toBe(321); // true
expect(x).toBe(123);     // true
请注意,这是一个高度简化的演示;我不能保证它是一个出色的表演者,我也不知道jasmine实际上是如何工作的,但考虑到这些限制,is做了您想要的。
我认为它很简洁,但我还是更喜欢defineProperty。

我看了一下源代码,以及expect的这个实现:

jasmine.Spec.prototype.expect = function(actual) {
  var positive = new (this.getMatchersClass_())(this.env, actual, this);
  positive.not = new (this.getMatchersClass_())(this.env, actual, this, true);
  return positive;
};
因此,属性
not
是同一类的实现,接收此额外参数以反转输出:

jasmine.Matchers = function(env, actual, spec, opt_isNot) {
  this.env = env;
  this.actual = actual;
  this.spec = spec;
  this.isNot = opt_isNot || false; // reverse option set
  this.reportWasCalled_ = false;
};
最后,在
jasmine.Matchers.matcherFn\uuz
中,它使用它来反转结果:

if (this.isNot) {
    result = !result;
}

这很好,非常感谢,它被简化了,但也很好。与Jasmine相比,它的实现没有那么复杂。你也回答了这个问题,但我只能选择一个。很抱歉:)非常感谢你花时间来解决这个问题,这看起来是一个非常复杂的实现,但对Jasmine来说可能是必要的。我想我应该坚持使用吸气剂!
if (this.isNot) {
    result = !result;
}