3

jQueryを使用し、Google ChromeとFirefoxで動作するGreasemonkeyユーザースクリプトを作成しています。ChromeのGreasemonkeyスクリプトを作成してユニットテストできるようにするにはどうすればよいですか?

私はこれを行う方法のいくつかの例を見てきました。そして、それらのすべては、パラメータとして別のコールバック関数を渡す「注入スクリプト」関数を呼び出すことに沸きます。

このコールバック関数内のコードは、jQuery$)オブジェクトへのアクセスを含む「魔法」が発生する場所です。

このソリューションは正常に動作します。しかし、それを使用しての結果の一つは、関数がコールバック関数は、その中から呼び出すことができません外を定義していることである。

function doSomethingImportantThatIWantToUnitTest(){ ... } 

function with_jquery(callback) { 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.textContent = "(" + callback.toString() + ")(jQuery)"; 
    document.body.appendChild(script); 
}; 

with_jquery(function ($) { 
    doSomethingImportantThatIWantToUnitTest(); // <---- meh. Not defined! 
}); 


だから、私は唯一の内部のコールバック関数定義された関数を使用することができます。しかし、これらの機能は、外部から呼び出すことはできません。特に、単体テストから呼び出すことはできません。たとえば、私にとっては非常に迷惑です。

Chrome用のGreasemonkeyスクリプトを作成してそれをユニットテストする方法はありますか?

+0

コンテンツスクリプトとページの有効範囲の間に厳密な分離があります。あなたは単位テストを注入することから何を止めますか? –

+3

単体テストやユーザスクリプトについて話しているが、問題の詳細がわかってから、特定のスコープの関数にアクセスできないという話があるので、あなたの質問はむしろ混乱します。関数とスコープの問題はJavaScriptの問題であり、userscriptsやunit-testingに特有ではありません...あなたはタイトルとあなたの特定の問題をより反映するように求めている質問に変更する必要がありますか? – Muhd

答えて

1

コールバック関数に関数の変数を含め、必要なものを渡すことができるはずです。

var f = function doSomethingImportantThatIWantToUnitTest(){ ... } 

function with_jquery(callback) { 
    var script = document.createElement("script"); 
    script.type = "text/javascript"; 
    script.textContent = "(" + callback.toString() + ")(jQuery,f)"; 
    document.body.appendChild(script); 
}; 

with_jquery(function ($, f) { 
    f(); // <---- DEFINED! 
}); 

あなたがやりたいいくつかの機能以上のものを持っているし、いくつかの異なる場所でコードを更新したくない場合は、あなただけのオブジェクトとしてすべての機能を持つオブジェクトまたは配列に渡すことができますプロパティまたは配列内の要素。

私の場合は、使用しているスコープ内で関数を定義するだけですが、

+0

@Rob Wコードをテストしたところ、うまくいきました。 – Muhd

+0

「作業中」を定義します。 'doSomethingImport ...'別名 'f'はページのスコープ内に定義されていません(これは')(jQuery、f) 'で仮定されています)。心配します。コンテンツスクリプト(Chrome)では、コンテンツスクリプト内で定義されたメソッドは、注入されたスクリプトでは使用できません。 –

関連する問題