不带括号的Javascript向后感知链接,例如expect(x).not.toBe()
今天我想用类似于Jasmine的方式做一些链接: Jasmine编写测试条件的风格非常流畅,例如:不带括号的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
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;
}