16

在 node.js 中,我无法让 superagent 和 nock 一起工作。如果我使用请求而不是超级代理,它会完美运行。

这是一个超级代理无法报告模拟数据的简单示例:

var agent = require('superagent');
var nock = require('nock');

nock('http://thefabric.com')
  .get('/testapi.html')
  .reply(200, {yes: 'it works !'});

agent
  .get('http://thefabric.com/testapi.html')
  .end(function(res){
    console.log(res.text);
  });

res 对象没有“文本”属性。出问题了。

现在,如果我使用请求做同样的事情:

var request = require('request');
var nock = require('nock');

nock('http://thefabric.com')
  .get('/testapi.html')
  .reply(200, {yes: 'it works !'});

request('http://thefabric.com/testapi.html', function (error, response, body) {
  if (!error && response.statusCode == 200) {
    console.log(body)
  }
})

模拟内容正确显示。

我们在测试中使用了 superagent,所以我宁愿坚持下去。有谁知道如何使它工作?

非常感谢,泽维尔

4

1 回答 1

13

我的假设是 Nock 响应application/json为 mime 类型,因为您响应的是{yes: 'it works'}. 在res.bodySuperagent 中查看。如果这不起作用,请告诉我,我会仔细看看。

编辑:

尝试这个:

var agent = require('superagent');
var nock = require('nock');

nock('http://localhost')
.get('/testapi.html')
.reply(200, {yes: 'it works !'}, {'Content-Type': 'application/json'}); //<-- notice the mime type?

agent
.get('http://localhost/testapi.html')
.end(function(res){
  console.log(res.text) //can use res.body if you wish
});

或者...

var agent = require('superagent');
var nock = require('nock');

nock('http://localhost')
.get('/testapi.html')
.reply(200, {yes: 'it works !'});

agent
.get('http://localhost/testapi.html')
.buffer() //<--- notice the buffering call?
.end(function(res){
  console.log(res.text)
});

现在任何一个都有效。这就是我相信正在发生的事情。nock 没有设置 mime 类型,并且假定为默认值。我假设默认是application/octet-stream. 如果是这种情况,superagent 不会缓冲响应以节省内存。你必须强制它缓冲它。这就是为什么如果你指定一个 mime 类型,你的 HTTP 服务无论如何都应该使用它,superagent 知道如何处理application/json以及为什么你可以使用res.text或者res.body(解析的 JSON)。

于 2013-02-04T15:59:56.170 回答