2

这是我的设置。

  • 我有一个 grunt 任务,它做了 2 件事:1)启动一个在某个端口上监听的 http 服务器 2)触发另一个 grunt 任务
  • test-index.html上面触发的 grunt 任务是一个 testem 任务,它在 PhantomJS的页面上运行测试。
  • test-index.html页面在我在第一个 grunt 任务中启动服务器的端口上发送一个 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)。

第二个问题是,当任务完成时,它会同时关闭所有正在运行的进程。

所以会发生什么:

  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 回答