今天我想通过与Jasmine类似的方式进行链接:http://pivotal.github.io/jasmine/
Jasmine具有非常流畅的编写测试条件的风格,例如:
expect(result).not.toBe(85);
在我的测试中,我只是想添加一个and
作为一些糖涂层,没有做任何事情:
createRegion('test').and.append()
所以这很简单(我知道以下在IE8<中工作过了):
Layout.prototype.__defineGetter__('and', function() {
return this;
});
但这让我对茉莉花的感兴趣:
defineProperty
(IE8<)或__defineGetter__
not
not
之后链接的方法是如何知道它的 - 我假设变量在reverse = true
方法中设置为not
,所以进行方法知道要反转它& #39;结果?你将如何实施这种行为,或者你知道茉莉是如何做到的?
答案 0 :(得分:1)
这是我想出来的一种方法,但如果你有很多方法,你会想要使用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
请注意这是一个高度简化的演示;我不保证它是一个伟大的表演者,我不知道茉莉是如何实际工作的,但是考虑到约束,你做了什么。 我觉得它很整洁,但我还是更喜欢defineProperty。
答案 1 :(得分:1)
我看了一下源代码,并期望这个实现:
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_
中,它使用它来反转结果:
if (this.isNot) {
result = !result;
}