2

これが私のセットアップです。

  • 私は2つのことを行う面倒なタスクを持っています:1)いくつかのポートでリッスンしているhttpサーバーを開始します2)別の面倒なタスクをトリガーします
  • 上記でトリガーされた grunt タスクは、PhantomJS のtest-index.htmlページでテストを実行する testem タスクです。
  • ページはtest-index.html、最初の単調なタスクでサーバーを起動するポートで POST 呼び出しを送信します。

問題: POST 呼び出しがサーバーにヒットしません。

注: 同じサーバーを (grunt からではなく) 手動で実行してからテスト grunt タスクを実行すると、POST 呼び出しがサーバーにヒットします。

コードは次のとおりです。

単調なタスク

grunt.registerMultiTask('coverage', 'Generates coverage reports for JS using Istanbul', function () {
 var server = http.createServer(function(req, resp) {
  resp.setHeader("Access-Control-Allow-Origin", "*");
  console.log('Got something');
  req.pipe(fs.createWriteStream('coverage.json'))
  resp.end();
 });
 var port = 7358;
 server.listen(port);

 // This task simply executes a command: `testem.js ci`
 grunt.task.run('testem').then(function() {
  server.close();
 });
});

test-index.html ( 内のどこか)

function onTestemLoad() {
 Testem.on('all-test-results', function(results){
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://localhost:7358/');
  xhr.send(JSON.stringify(window.__coverage__))
 });
}

ここで何がうまくいかないのか誰でも指摘できますか?

4

1 に答える 1

0

に惑わされましたgrunt.task.runこの行はタスクを実行しません。現在のタスクが完了したら実行するタスクのリストの一番上に置くだけです( http://gruntjs.com/api/grunt.task#grunt.task.run )。

2 つ目の問題は、タスクが完了すると、実行中のすべてのプロセスが停止することです。

したがって、何が起こるかは次のとおりです。

  1. coverage起動し、サーバーでスピンし、testem次のタスクとして登録します
  2. coverage終了し、サーバーをダウンさせます
  3. 次のタスク (= testem) が実行されますが、応答するサーバーがありません...

次の2つのことを行うことで修正できます。

  • テストをインライン化します: grunt.task.run('testem')testem への直接呼び出しに置き換えます
  • テストが同期的に実行されることを確認するか、テストが完了するまでタスクを存続させます (使用this.async- http://gruntjs.com/api/inside-tasks#this.asyncを参照)。
于 2015-09-25T07:26:08.567 に答える