2013-06-28 27 views
2

今天,我想做点什么以类似的方式链接到茉莉花:http://pivotal.github.io/jasmine/的Javascript无支架向后感知链

茉莉花具有编写条件测试,例如一个非常流畅的风格:

expect(result).not.toBe(85); 

在我的测试我只是想一个and添加为确实没有像一些糖衣:

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

所以这是非常简单(我我知道下面会不会在IE8 <)工作:

Layout.prototype.__defineGetter__('and', function() { 
    return this; 
}); 

但是,这让我感兴趣的茉莉如何:

  • 做无支架链接时,我无法找到的任何实例defineProperty(IE8 <)或__defineGetter__
  • 无法找到它定义了not
  • 试图想象not后链接的方法是如何意识到这一点 - 我地设想在not方法中将变量设置为reverse = true,所以前进方法知道将其结果逆转?

你将如何实施这样的行为,或者你知道茉莉花是如何做到的?

回答

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; 
} 
+0

非常感谢花时间弄清楚,这似乎是一个相当复杂的实施,但可能需要为茉莉花。我想我会坚持使用getters! –

1

这里是我想出了把它关闭的一种方式,但如果你有很多的方法,你要改用干将重复:

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。

+0

这非常感谢,很简单,但也看到一个不太复杂的实施比茉莉花。你也回答了这个问题,但我只能选择一个对不起:) –