3

今天我想做一些与 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 = truenot方法中一样设置,所以进行中的方法知道要反转它的结果?

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

4

2 回答 2

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;
}
于 2013-06-28T19:12:49.507 回答
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。

于 2013-06-28T19:01:12.113 回答