我是一名拥有强大 JavaScript 背景的架构师,但我过去做过一些 .NET 和 Java。
但是,我想尝试一下 ActionScript3,我得到了承诺,它与 JavaScript 非常相关。
作为一个启动项目,我自己尝试移植到我最喜欢的断言实用程序之一的 ActionScript3 - should.js - 让您的测试代码非常易于阅读。
更新时间:2013-02-19
我看到我对我的抽象演讲感到困惑,所以我用脑海中的具体问题替换了一些帖子。这是完整的图片:
考虑以下 JavaScript 代码:
Object.defineProperty(Object.prototype, 'should'
, { set: function(){}
, get:
function(){
return new Assertion(Object(this).valueOf());
}
, configurable: true
, enumerable : false
}
);
这是 JavaScript 模块实现的一部分Should
。另一部分是类的定义Assertion
,它是用一个值构造的,并针对该值实现了一组广泛而漂亮的断言方法。类似的方法
var o = Assertion(actualValue)
o.equals(expectedValue1)
o.moreThan(expectedValue2)
o.contains(expectedValue3)
和保持英语语法的别名
var o = Assertion(actualValue)
o.equal(expectedValue1)
o.contain(expectedValue3)
和懒惰神枪手的别名,比如
o.eql(expectedValue)
o.gt(expectedValue) //greater then
o.gte(...) //greater then or equal
//and so on...
和一些只返回的连接器,(这是用测试值构造this
的实例),比如Assertion
o.be
o.and
它给了你什么?
如下所示的测试代码:
var person = getPerson();
Should.exist(person); //that's a static call, and that's easy
//but these are a member calls:
person.should.have("name","age","address","friends");
person.name.should.equal("John");
person.age
.should
.be.number()
.and.be.between(20,30);
person.address
.should
.be.string().and
.startWith("\d").and
.endWith(" st.")
//or even
.and.match(/^[0-9]{1,9}\s+[A-Z][a-z0-9 ]* st\.$/);
person.friends
.should
.be.array().and
.be.between(3,5).and
.containOnlyType(String);
那不是很棒吗?这是简单的英语!
你可以争论缩进的美学,在哪里放置and
,以及它们是否有必要,但除此之外 - 任何人都可以阅读或编写它:一旦你采用了每个对象上都存在但不会破坏地图的“应该”属性迭代 - 您可以继续链接您必须声明的关于您开始的价值的任何内容。
它可以有更多漂亮的迭代工具、反射实用程序、增加与您的对象模型相关的测试功能等等,但让我们完成第一步:)
但是为此,您需要系统中的每个对象都具有一个不可枚举的智能属性,称为should
该属性,在它的getter函数中返回一个使用Assertion
构造的对象this
作为测试值。
(你什么都没有看到——等着看它给出的漂亮的拒绝信息!Yummie!!所以是的——我很乐意牺牲将属性称为“应该”的选项......并且也会很乐意放弃智能感知——至少只要是简单的英语)
所以,在评论中,bfavaretto给了我们第一步——我们知道如何防止枚举属性——太好了,谢谢!!
现在,我们可以让它成为一个 getter 属性,它的函数可以访问this
?
当我完成后,我将把它放在麻省理工学院许可的一些公共回购中,让我们所有人都能玩得开心:)
帮助任何人?