1

オブジェクトが特定のトピックにサブスクライブされているかどうかをテストするために doh を使用する方法を知っている人はいますか?

この種のテストについて説明しているドキュメントを見つけるのに苦労しています。

私がこれを尋ねている理由は、ウィジェットを作成するときにトピックにサブスクライブするためです。ウィジェットが構築後に常にそのトピック サブスクリプションを持っているかどうかをテストする単体テストが必要でした。

トピックには、サブスクリプションを作成するときにトピック文字列として使用するプライベート変数があります。

たとえば、「CustomTopic」というトピックは次のとおりです。

define([], function(){

    var topicString= "topicString";

    return {
        TOPIC_STRING: function(){
            return topicString;
        }
    }
})

私のウィジェットのコンストラクタは次のようになります。

constructor: function() {   
    topic.subscribe(CustomTopic.TOPIC_STRING(), function(params) {doSomething(params)});
}

ウィジェットが持っているすべてのサブスクリプションを確認する方法を理解できれば、プライベート変数の値に対してトピックのサブスクリプションをチェックするのがいかに簡単であるかがわかりますか?

参考のため:

Dojo 1.8 ドキュメント

Dojo のテスト util "doh" docs

4

1 に答える 1

2

実装ではなく動作に集中する場合、テストはより堅牢で有用になることをお勧めします。この場合、サブスクリプション自体をキャッチしようとするよりも、ウィジェットがトピックに応答するかどうかをテストする方が理にかなっています。

もちろん、topic.subscribe をラップしたり (悪いこと)、ウィジェットのハンドルのプライベート リストを検査したり (別の悪いこと) することもできます。ちなみに、実際に topic.subscribe によって返されたハンドルを保存して、後でオブジェクトが破棄されたときにハンドルを削除 (以前は登録解除) できることを願っています。

それらよりも、単純に新しいオブジェクトを作成し、そのトピックに発行して、doSomething が呼び出されたかどうか、または目的の結果が得られたかどうかを確認することをお勧めします。doh は関数呼び出しのリッスンをサポートしていませんが、この目的には dojo/aspect が理想的です。したがって、次のようなものがあるかもしれません:

var myWidget = new myWidget(); // presumably subscription happened, 
                               // but we only care about later behaviour
var somethingDone = false;
aspect.after(window, "doSomething", function(){somethingDone = true;});
topic.publish(CustomTopic.TOPIC_STRING());
doh.assertTrue(somethingDone);

実際、doSomething はグローバル メソッドではないと想定しているため、スコープを適切に設定する必要がありますが、それ以外の場合は問題なく動作するはずです。現在、topic.publish は同期であるため、問題なく動作するはずですが、将来非同期になる可能性があります。その場合は、後の段階まで doh.assertTrue を呼び出さないようにする必要があります。

于 2013-02-03T14:12:36.140 に答える