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

时间:2015-10-26 15:20:41

标签: node.js q synchronous

如何使用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. 
    }

2 个答案:

答案 0 :(得分:0)

您的代码中存在多个错误

Q.fcall(readFile())

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

然后,readFile不会返回任何承诺(事实上,它什么都不返回)。因此q库不能使用任何东西来等待任何异步工作的结束。 then回调将立即解雇。

答案 1 :(得分:0)

您可以使用Q.ninvokereadFile函数返回承诺,然后您可以使用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. 
}