0

JSUnitを使用してイベントハンドラーがノードにバインドされていることを確認するにはどうすればよいですか?

これが私が持っているものです:

var mynode = document.getElementById( "mynode" );

assertNotNull( mynode );

MyLibrary.attachEvent( mynode, "click", function( ){ return true; } );

assertEquals( typeof mynode.onclick, typeof function( ){ return true; } );

ただし、mynode.onclickのタイプはもちろんオブジェクトです。関数のタイプは..まあ...関数です。

試してみるとassertEquals( mynode.onclick, function( ){ return true; } );、アサーションも失敗します。

助言がありますか?

4

2 に答える 2

1

JSUnitはわかりませんが、使ってみませんtoString()か?

assertEquals(mynode.onclick.toString(), "function( ){ return true; }");

もちろん、文字列の同等性には問題があります。しかし、少しの努力で、これら2つの文字列のすべての空白を取り除き、タブ、スペース、改行なしで比較することができます...

javascriptでメソッド/関数を比較できるとは思いません。2つの関数を比較したい場合は、実際にはそれらの参照を比較しています。つまり、コード内の異なる場所でまったく同じ関数を指定すると、それは異なる関数として扱われます(異なるアドレスを持ちます)。

平等の詳細については、こちらをご覧ください。厳密な平等演算子

編集:あなたはこの方法でテストを書くことを試みることができます、しかしそれでも得る可能性がありますfalse

var myHandler = function() { return true; };
MyLibrary.attachEvent( mynode, "click", myHandler);
assertEquals(mynode.onclick, myHandler);

まったく同じ関数を使用しているため、どちらの場合も同じ参照を使用しています。MyLibrary.attachEventただし、渡された参照をどのように処理するかについて注意する必要がありますmyHandler(コピー、拡張、参照の保存など)。

于 2011-03-16T21:43:52.840 に答える
1

「onclick」プロパティはaddEventListenerと同じメカニズムではないことに注意してください。

たとえば、MyLibrary.attachEventはaddEventListener(標準準拠)/ attachEvent(IE <9)メソッドを使用しているため、mynode.onclickプロパティはおそらくnullに等しくなります。したがって、テストします:

typeof mynode.onclick = typeof null = "object"

ここで問題となるのは、DOMレベル2イベント仕様が作成されたときに、ノードに現在登録されているイベントのリストへのアクセサーを提供するのを忘れていることです。したがって、基本的に、実装しようとする単体テストを作成することはできません

DOMレベル3イベント仕様(まだドラフトモード)は、要素の新しいプロパティを介して2002年に問題に対処しました:eventListenerList

残念ながら、現在のドラフトではこのプロパティが削除されているようで、ブラウザで実装されているとは思いません。

getListenerInfoFor()メソッドを実装しているFirefox 3.6しか見つかりませんでしたが、chrome / XULモードでしか利用できないようで、役に立ちません。

あなたはどちらか

  • eventListenerListがすべてのブラウザに実装されるのを待ちます;-)
  • MyLibraryがイベントを正しく追加することを信頼する
  • コールバック関数内にテストコードを含む偽のイベントを追加し、要素にクリックイベントをディスパッチします

これがお役に立てば幸いです

ジェローム・ワーグナー

于 2011-03-16T22:08:22.817 に答える