在nodejs中使用Q库进行HTTP api响应测试



如何使用Q使其等待,直到之前的响应来自服务器。我在这里要做的是比较测试服务器和生产服务器对相同请求的响应。

我从两个服务器得到响应,但无法比较它们,因为在响应返回之前执行了assert语句。

有谁知道我做错了什么吗?下面是代码。
    var Q = require('q');
    var path='';
    var prodResponse = '';
    var tstReponse = '';
    Q.fcall(readFile())
      .then(secondFunction())
      .then(thirdFunction())
      .then(function(){
          console.log("prodResponse: "+prodResponse);
          console.log("tstResponse: "+tstResponse);
          assert.strictEqual(prodResponse, tstResponse)
      })
      .catch(function(){
        console.log('error occurred');
      })
      .done();
    function readFile(){
      fs.readFile('hostname.json', function (err, data) {
        if (err) return  console.error(err);
          path = JSON.parse(data);
return JSON.parse(data);
        });
    }
    function secondFunction(){
      var prodOptions = {
        hostname: 'somehostname.com',
        port: 80,
        path: "/path?"+path.path,
        method: 'POST',
        headers: {
          'Content-Type': 'application/json;charset=UTF-8'
        },
        auth : ''
      };
      return http.request(prodOptions, function(res) {
        console.log('Prod');    
        res.setEncoding('utf8');
        res.on('data', function (chunk) {
          prodResponse = chunk;
          return chunk;
        });
        res.on('end', function() {
          console.log('No more data in response.');
        })
      }).on('error', function(e) {
        console.log('problem with request: ' + e.message);
      }).end();
    }
    function thirdFunction(){
    // same a second, only difference is the response http. 
    }

你的代码中有多个错误

Q.fcall(readFile())

您的q变量是q而不是Q。所以这一行会崩溃,因为Q是未定义的(javascript是区分大小写的)。

那么,readFile不返回任何promise(事实上,它什么也不返回)。所以q库不能使用任何东西来等待任何异步工作的结束。then回调将立即被触发。

你可以使用Q.ninvoke让你的readFile函数返回一个承诺,你可以使用Q.defer从你的secondFunction创建并返回一个承诺:

var Q = require('q');
var path='';
var prodResponse = [];
var tstReponse = '';
readFile()
  .then(secondFunction())
  .then(thirdFunction())
  .then(function(){
      console.log("prodResponse: "+prodResponse);
      console.log("tstResponse: "+tstResponse);
      assert.strictEqual(prodResponse, tstResponse)
  })
  .catch(function(){
    console.log('error occurred');
  })
  .done();
function readFile(){
  return Q.ninvoke(fs, 'readFile', 'hostname.json').then(function (data) {
    path = JSON.parse(data);
    return path;
  }, function (err) {
    console.error(err);
  });
}
function secondFunction(){
  var prodOptions = {
    hostname: 'somehostname.com',
    port: 80,
    path: "/path?"+path.path,
    method: 'POST',
    headers: {
      'Content-Type': 'application/json;charset=UTF-8'
    },
    auth : ''
  };
  var defer = Q.defer();
  var chunks = [];
  http.request(prodOptions, function(res) {
    console.log('Prod');    
    res.setEncoding('utf8');
    res.on('data', function (chunk) {
      chunks.push(chunk);
    });
    res.on('end', function() {
      console.log('No more data in response.');
      prodResponse = chunks.join('');
      defer.resolve(prodResponse);
    })
  }).on('error', function(e) {
    console.log('problem with request: ' + e.message);
    defer.reject(e);
  }).end();
  return defer.promise;
}
function thirdFunction(){
// same a second, only difference is the response http. 
}

相关内容

  • 没有找到相关文章

最新更新