私はJavaScriptの強力なバックグラウンドを持つアーキテクトですが、過去に.NETとJavaをいくつか実行しました。
しかし、JavaScriptに非常に関連していると約束されたActionScript3を手に入れたかったのです。
スタートアッププロジェクトとして、私は自分自身でActionScript3への移植を試みました。これは私のお気に入りのアサーションutilsの1つである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
もう1つの部分は、値を使用して構築され、その値に対して幅広く優れたアサーションメソッドのセットを実装するクラスの定義です。次のようなメソッド
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関数でテスト値としてで構築されたオブジェクトを返すという列挙不可能なスマートプロパティを備えている必要があります。should
Assertion
this
(あなたはまだ何も見ていません-それが与える美しい拒絶メッセージを見るのを待ってください!Yummie!!そうそう-私は属性を「すべき」と呼ぶオプションを喜んで犠牲にします...そして幸いにも知性をあきらめます-少なくともそれが平易な英語である限り)
したがって、コメントで、bfavarettoは私たちに最初のステップを与えました-属性の列挙を防ぐ方法を知っています-素晴らしい&ありがとう!!
さて、関数がアクセスできるゲッター属性にすることはできますthis
か?
私が終わったら、私たち全員が楽しむために、MITの下で認可されたいくつかの公開リポジトリにそれを置くつもりです:)
誰か助けますか?