Nock - 如何模拟二进制响应

时间:2015-05-23 00:54:36

标签: javascript node.js unit-testing paypal nock

我正在编写与PayPal经典API交互的代码。此交互的第一部分是向PayPal发送请求并从中获取令牌。为此,我使用简单的https请求:

function makePayPalRequestForToken(options, callback) {

var requestOptions = {
    host: config.paypal.endpoint,
    path: '/nvp?' + qs.stringify(options),
    method: 'GET'
};
var req = https.get(requestOptions, function(res) {
    var data = '';

    res.on('data', function(chunk) {
      data = data + chunk;
    });

    res.on('end', function() {
      callback(null, data);
    });
});

req.on('error', function(e) {
    callback(e);
});

}

它与PayPal沙箱完全正常,但是,现在我想对我的代码进行单元测试,我不知道如何模拟我从PayPal获得的响应。

我检查了PayPal的行响应如下:

<Buffer 54 4f 4b 45 4e 3d 45 43 25 32 64 35 44 53 33 38 35 31 37 4e 4e 36 36 37 34 37 33 4e 26 54 49 4d 45 53 54 41 4d 50 3d 32 30 31 35 25 32 64 30 35 25 32 64 ...>

所以它看起来像二进制数据。我想使用nock来模拟响应,但我想知道我怎么能这样做?如何使用我的响应的二进制版本来响应?

我试过这样的事情:

nock('https://' + config.paypal.endpoint)
                    .filteringPath(function() {
                       return '/';
                     })
                    .get('/')
                    .reply(200, 'myresponse', {'content-type': 'binary'});

但后来我得到了:

  

未捕获错误:EOF后的stream.push()

看起来模拟的响应中没有数据发送。

1 个答案:

答案 0 :(得分:4)

如果您不知道如何捕获从实际服务器获取的响应并将其复制到nock中,那么请阅读nock's awesome recording capability

使用nock.recorder.rec()记录服务器的实际响应。使用nock.recorder.play()获取结果。它应该是一个可以字符串化为JSON的对象。将JSON放在一个文件中,您可以使用nock.load()在单元测试中使用。

更新:在评论中来回一些后,发现OP面临的具体问题可以通过将Node更新到v0.12.4或更高版本来解决。 This commit特别看起来可能是相关的。