Yeoman で実行した素晴らしいクライアント側のテストを取得しました。Yeoman は私の CoffeeScript をコンパイルし、サーバーでテスト ページを開き、PhantomJS でアクセスして、すべてのテスト結果をコマンド ラインに渡します。このプロセスは非常にハックで、テスト結果はalert()
メッセージを介して Phantom プロセスに渡され、Phantom プロセスは一時ファイルを作成し、JSON としてメッセージを入力します。Yeoman (Grunt) は一時ファイルをループし、テストを解析してコマンド ラインに表示します。
プロセスを説明したのは、それにいくつかのことを追加したいからです。サーバー側のテストも受けました。彼らは mocha と supertest を使用して API エンドポイントをチェックし、Redis クライアントを使用してデータベースの状態が期待どおりであることを確認します。しかし、これら 2 つのテスト スイートをマージしたいのです。
サーバー呼び出しに対するクライアント側のモック応答を書きたくありません。サーバーのモックデータを送信したくありません。途中でサーバーまたはクライアントを変更しても、テストは失敗しません。実際の統合テストを行いたい。そのため、クライアント側でテストが終了するたびに、サーバー側で関連するテストを実行するフックが必要です (データベースの状態、セッションの状態を確認し、別のテスト ページに移動します)。
これに対する解決策はありますか?または、代わりに、Yeoman / Grunt / grunt-mocha のどこからハッキングを開始して、これを機能させるのですか?
grunt-mocha の Phantom Handlers は、始めるのに適した場所だと思います。
// Handle methods passed from PhantomJS, including Mocha hooks.
var phantomHandlers = {
// Mocha hooks.
suiteStart: function(name) {
unfinished[name] = true;
currentModule = name;
},
suiteDone: function(name, failed, passed, total) {
delete unfinished[name];
},
testStart: function(name) {
currentTest = (currentModule ? currentModule + ' - ' : '') + name;
verbose.write(currentTest + '...');
},
testFail: function(name, result) {
result.testName = currentTest;
failedAssertions.push(result);
},
testDone: function(title, state) {
// Log errors if necessary, otherwise success.
if (state == 'failed') {
// list assertions
if (option('verbose')) {
log.error();
logFailedAssertions();
} else {
log.write('F'.red);
}
} else {
verbose.ok().or.write('.');
}
},
done: function(failed, passed, total, duration) {
var nDuration = parseFloat(duration) || 0;
status.failed += failed;
status.passed += passed;
status.total += total;
status.duration += Math.round(nDuration*100)/100;
// Print assertion errors here, if verbose mode is disabled.
if (!option('verbose')) {
if (failed > 0) {
log.writeln();
logFailedAssertions();
} else {
log.ok();
}
}
},
// Error handlers.
done_fail: function(url) {
verbose.write('Running PhantomJS...').or.write('...');
log.error();
grunt.warn('PhantomJS unable to load "' + url + '" URI.', 90);
},
done_timeout: function() {
log.writeln();
grunt.warn('PhantomJS timed out, possibly due to a missing Mocha run() call.', 90);
},
// console.log pass-through.
// console: console.log.bind(console),
// Debugging messages.
debug: log.debug.bind(log, 'phantomjs')
};
ありがとう!これには賞金がかかります。