【问题标题】:Mock api stream output in nodejs在nodejs中模拟api流输出
【发布时间】:2017-11-09 18:49:13
【问题描述】:

我正在尝试模拟作为我正在解析的 XML 中的流(块)的外部 API 输出。 我正在尝试编写一个单元测试来模拟 API 并发送模拟数据,但它不适用于我用于 API 模拟的 NOCK。

当我运行测试时,我看到 res.on('data', function(data_) { 不会被执行。 如果您想运行,请创建包含任何 XML 内容的“a.txt”文件。

感谢任何帮助。除了 NOCK 之外的任何其他框架也是受欢迎的。

var request = require('superagent');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();

var getMyData = function(callback) {
  parser.on('error', function(err) {
     console.log('Parser error', err);
     callback('Error Occurred!'+err);
  });

 var data = '';
  request    
    .get(`https://myapp.com`)    
    .end(function(err, res) {      
      if (res.statusCode >= 200 && res.statusCode < 400) {        
        res.on('data', function(data_) {
          //console.log('--------------------------');
          data += data_.toString();
        });        
        var datainjson = '';
        res.on('end', function() {          
          parser.parseString(data, function(err, result) {            
            if(!err){
              datainjson = JSON.stringify(result);
            }else{
              datainjson = 'Error Occurred!'+err;
            }
          });
          callback(err, datainjson);
        });
      }
  });
};
module.exports.getMyData = getMyData;


var should = require('chai').should();
var expect = require('chai').expect;
var nock = require('nock');
var fs = require('fs');
var getMyData = require('./index4').getMyData;

describe('test mock', function() {

  beforeEach(function() {        
    // Mock the TMDB configuration request response
    nock('https://myapp.com')
      .get('')
      .reply(200, function (req, res) {        
            var stream = fs.createReadStream('a.txt');
            stream.pipe(res);                
        });
  });

  it('should have data', function(done) {
    this.timeout(3000);
    getMyData(function(err, testdata) {
      var x = JSON.parse(testdata);      
      });
      done();
    });
  });

});

【问题讨论】:

  • 您应该解释“不工作”是什么意思。也许阅读stackoverflow.com/help/how-to-ask 可以帮助您改进问题。
  • @Markus : res.on('data', function(data_) 没有被执行。因此超时错误来了。
  • 您应该将这些信息添加到问题中。因此,试图提供帮助的人只需阅读问题即可掌握一切。
  • 我已按照 Markus 的建议更新了相关细节。

标签: javascript node.js mocking nock


【解决方案1】:

你应该从 nock 回复回调中返回流:

nock('https://myapp.com')
  .get('')
  .reply(200, function () {        
    return fs.createReadStream('a.txt');
  });

【讨论】:

    猜你喜欢
    • 2016-01-13
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    相关资源
    最近更新 更多