should_beのポイントと注意点
JSSpecで使えるshould_beを使っていろいろなオブジェクトを比較した場合の動作を確認したので、ポイントや注意点をまとめておきます。
- オブジェクトは「属性が一致するか?」で評価される模様。
- 「{}」で作成したものだけでなく、「new」で作成されたオブジェクトも同様です。
- 属性のみ評価されるので、「new A()」と「new C()」でも、属性が一緒であれば同じになります。作成元関数?の違いは結果に影響しません。
- また、オブジェクトの関数の内容も評価されないようです。
- 配列やオブジェクトは再帰的にプロパティを辿って比較を行なってくれます。
- ネストされた配列やオブジェクトも普通に比較できます。
- "1"と1は同じとされたのでこの点は注意。
- どこかで型変換されてるのかも。
検証で使用したspecは以下。
describe('文字列 "aaa" を対象にした "should_be" の動作確認', { 'before' : function() { target = "aaa"; }, '"aaa" は同じ ': function() { value_of(target).should_be("aaa"); }, '"bbb" は違う ': function() { value_of(target).should_be("bbb"); } }); describe('数値 1 を対象にした "should_be" の動作確認', { 'before' : function() { target = 1; }, '1 は同じ ': function() { value_of(target).should_be(1); }, '2 は違う ': function() { value_of(target).should_be(2); }, '"1" は同じ ': function() { value_of(target).should_be("1"); }, '1.0 は同じ ': function() { value_of(target).should_be(1.0); }, '1.1 は違う ': function() { value_of(target).should_be(1.1); } }); describe('配列 [1,2,3] を対象にした "should_be" の動作確認', { 'before' : function() { target = [1,2,3]; }, '[1,2,3] は同じ ': function() { value_of(target).should_be([1,2,3]); }, '[1,2] は違う ': function() { value_of(target).should_be([1,2]); }, '[1,3,2] は違う ': function() { value_of(target).should_be([1,3,2]); } }); describe('ネストされた配列 [1,["a","b"],{a:"b"}] を対象にした "should_be" の動作確認', { 'before' : function() { target = [1,["a","b"],{a:"b"}]; }, '[1,["a","b"],{a:"b"}] は同じ ': function() { value_of(target).should_be([1,["a","b"],{a:"b"}]); }, '[1,["a"],{a:"b"}] は違う ': function() { value_of(target).should_be([1,["a"],{a:"b"}]); }, '[1,["a","b"],{a:"c"}] は違う ': function() { value_of(target).should_be([1,["a","b"],{a:"c"}]); } }); describe('オブジェクト {a:"aa",b:1,c:[1,2,3]} を対象にした "should_be" の動作確認', { 'before' : function() { target = {a:"aa",b:1,c:[1,2,3]}; }, '{a:"aa",b:1,c:[1,2,3]} は同じ ': function() { value_of(target).should_be({a:"aa",b:1,c:[1,2,3]}); }, '{a:"aa",b:2,c:[1,2,3]} は違う ': function() { value_of(target).should_be({a:"aa",b:2,c:[1,2,3]}); }, '{a:"aa",c:[1,2,3]} は違う ': function() { value_of(target).should_be({a:"aa",c:[1,2,3]}); }, '{a:"aa",b:1,c:[1,3,2]} は違う ': function() { value_of(target).should_be({a:"aa",c:[1,3,2]}); } }); // テスト用クラス A = function() {}; A.prototype = { test : function(){return "a";} }; B = function() {}; C = function() {}; C.prototype = { test : function(){return "c";} }; describe('オブジェクト new A() を対象にした "should_be" の動作確認', { 'before' : function() { target = new A(); }, 'new A() は同じ ': function() { value_of(target).should_be(new A()); }, 'new B() は違う ': function() { value_of(target).should_be(new B()); }, 'new C() は同じ ': function() { value_of(target).should_be(new C()); } });