Nock-如何模拟二进制响应

Jak*_*kub 4 javascript unit-testing paypal node.js 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);
});
Run Code Online (Sandbox Code Playgroud)

}

它在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 ...>
Run Code Online (Sandbox Code Playgroud)

因此,它看起来像二进制数据。我想使用nock模拟响应,但是我不知道该怎么做?如何使nock响应的二进制版本?

我尝试过这样的事情:

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

但是然后我得到:

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

并且看起来没有数据发送到模拟响应中。

Tro*_*ott 5

如果您不知道如何捕获从实际服务器获得的响应并将其复制到nock中,请继续阅读nock出色的记录功能

使用nock.recorder.rec()记录来自服务器的实际响应。使用nock.recorder.play()得到的结果。它应该是可以字符串化为JSON的对象。将JSON放入文件中,即可用于nock.load()单元测试中。

更新:经过反复评论,我们发现可以通过将Node更新到v0.12.4或更高版本来解决OP所面临的特定问题。该提交看起来特别重要。