2016-04-06 15 views
2

私はuserscriptを持っています(うまくいけばブラウザ間で互換性がありますが、今はTampermonkeyで実行しています)、私はテストスイートを設定しようとしています。 または、テストスイートを作成する際に取ったアプローチが妥当かどうか、それを別の方法で行うべきかどうかを試してみてください。shでユーザスクリプトをテストする

userscriptはかなり簡単です:たくさんの関数を定義し、そのうちの1つを呼び出して作業します。 <a href="https://nodejs.org/">node</a>でチェックするには、関数を定義したいが、(DOMプロパティを扱うためのブラウザがないので)初期関数の実行を避けたい。だから私は(うまくいけば、かなりの互換性;私はdash上でそれを実行している)この醜いシェルスクリプトを実行します。

#!/bin/dash 
grep -ev '^\s*stuff\s*\(\s*\)\s*;?\s*($|//)' oeis-tools.user.js > test-cat.js 
./getFunctions.sh >> test-cat.js 
cat test.js >> test-cat.js 
nodejs test-cat.js 
rm test-cat.js 

をだから、基本的に私は、テストスクリプトとcatそれを、それを渡し、関数が呼び出された行をドロップノードへ。 テストスクリプトの中で、私は私が形shouldBe(functionToTest, [firstInput, secondInput, etc], [correctOutput, otherCorrectOutput])でテストを呼び出すことができますアサートに似た機能

function shouldBe(func, args, desiredResults) { 
    totalTests++; 
    tested.push(func.name); 
    var actualResult = func.apply(null, args); 
    if (isIn(actualResult, desiredResults)) return; 
    console.log('Called ' + func.name + '(' + args.map(disp).join(', ') + ')'); 
    if (desiredResults.length === 1) { 
     console.log('\tExpected ' + disp(desiredResults[0])); 
    } else { 
     console.log('\tExpected ' + desiredResults.map(disp).join(' or ')); 
    } 
    console.log('\tGot  ' + disp(actualResult)); 
    failedTests++; 
} 

を持っています。 (私はさまざまなヘルパー関数の定義を省略しましたが、その正確な定義はここでは重要ではありません)

プラスの面では、これによりテストを素早く書いて、手書きのまま手書きで書くことができます。しかし、それはかなりハッキーのようです。より良いアプローチがありますか?

+0

あなたはDOMプロパティとはどういう意味ですか?このスクリプトを使用して呼び出しを取り除いている関数にコードを投稿できますか?要求しているDOMプロパティをシミュレーションまたはシムする方法があります。 – TheHansinator

+0

@ Compynerd255:長いページの一種で、基本ページはタグスープです。実際これは重要な点です。サイトはすぐに再設計される予定で、DOM関連のコードをすべて書き直す必要があります。しかし、私はその部分のエラーについてあまり心配していません。エラーの大半は、DOM関連のコードから分離した興味深い部分で発生します(実際は、より多くのエラーが発生します。テストしますが、これは便利な副作用です)。 – Charles

+0

@ Compynerd255:あなたが本当に好きなのは、ファイル(約1000行)をペーストビンなどにダンプすることができますが、巨大なコードを見て、デバッグを依頼している人たちを恐れたくはありませんそれ。 :) – Charles

答えて

1

EDIT:(別のファイルにテスト機能を置くの勧告から変更の回答)

DOMの存在は、あなたのstuff()機能の前提条件であるので、あなたが最後にであなたが作る呼び出しをラップすることができifDOMの存在をチェックするステートメント。

if (document) { 
    stuff(); 
} 

それとも、いっそ、機能は一つだけの場所で呼び出されていることから、

if (document) { 
    /* code of stuff() */ 
} 
+0

これはユーザースクリプトであるため、1つにする必要があります作業するファイル。 – Charles

+0

@Charlesシングルファイル実行をサポートするように編集されました。 – TheHansinator

関連する問題