2012-11-26 59 views
17

我正在嘗試編寫一個測試,用於檢查API路由是否輸出帶有正確內容的ZIP文件。在node.js上讀取響應超supertest/superagent的輸出緩衝區/流服務器

我正在使用mocha和supertest進行測試,我想實際讀取輸出流/緩衝區,讀取zip文件內容並查看內容是否正確。

任何想法我應該怎麼做?當我嘗試閱讀res.body時,它只是一個空的對象。

request(app) 
    .get("/api/v1/orders/download?id[]=1&id=2") 
    .set("Authorization", authData) 
    .expect(200) 
    .expect('Content-Type', /application\/zip/) 
    .end(function (err, res) { 
     if (err) return done(err); 

     console.log('body:', res.body) 

     // Write the temp HTML file to filesystem using utf-8 encoding 
     var zip = new AdmZip(res.body); 
     var zipEntries = zip.getEntries(); 

     console.log('zipentries:', zipEntries); 

     zipEntries.forEach(function(zipEntry) { 
     console.log(zipEntry.toString()); // outputs zip entries information 
     }); 

     done(); 
    }); 

回答

1

我想你會想爲應用程序/ zip創建你自己的解析器,並用它來獲取實際的響應數據;例如,JSON解析器是here。一旦你有了,你可以通過將它傳遞給request.parse來使用它;所以你的測試會變成:

request(app) 
    .get("/api/v1/orders/download?id[]=1&id=2") 
    .set("Authorization", authData) 
    .expect(200) 
    .expect('Content-Type', /application\/zip/) 
    .parse(function (res, fn) { 
    res.data = ''; 
    res.on('data', function (chunk) { res.data += chunk; }); 
    res.on('end', function() { 
     try { 
     fn(null, new AdmZip(res.data)); 
     } catch (err) { 
     fn(err); 
     } 
    }); 
    }) 
    .end(function (err, res) { 
    if (err) return done(err); 

    console.log('body:', res.body) 

    // Write the temp HTML file to filesystem using utf-8 encoding 
    var zipEntries = res.body.getEntries(); 

    console.log('zipentries:', zipEntries); 

    zipEntries.forEach(function(zipEntry) { 
     console.log(zipEntry.toString()); // outputs zip entries information 
    }); 

    done(); 
    }); 

要找到答案,我主要依靠檢查superagent測試套件。 :)

22

擴大對@博的回答,下面可以用來獲得任何二進制響應內容作爲緩衝,你可以在request.end()進一步檢查:

function binaryParser(res, callback) { 
    res.setEncoding('binary'); 
    res.data = ''; 
    res.on('data', function (chunk) { 
     res.data += chunk; 
    }); 
    res.on('end', function() { 
     callback(null, new Buffer(res.data, 'binary')); 
    }); 
} 

// example mocha test 
it('my test', function(done) { 
    request(app) 
     .get('/path/to/image.png') 
     .expect(200) 
     .expect('Content-Type', 'image.png') 
     .buffer() 
     .parse(binaryParser) 
     .end(function(err, res) { 
      if (err) return done(err); 

      // binary response data is in res.body as a buffer 
      assert.ok(Buffer.isBuffer(res.body)); 
      console.log("res=", res.body); 

      done(); 
     }); 
}); 
+1

這很好,雖然我不得不添加'.buffer()'到請求。 – Nate

+0

使用@Nate,從[docs](http://visionmedia.github.io/superagent/#parsing-response-bodies),「如果響應緩衝未啓用(.buffer(false)),那麼響應事件將被釋放而不用等待身體解析器完成,所以response.body將不可用「。 – ZachB

+0

@ZachB so。.buffer()。parse(binaryParser)'? – rcoup

-1

現有的答案並沒有爲我工作。我最終做的是:

// parses response.body buffer into a data object 
const parsePDF = response => { 
    return new Promise((resolve, reject) => { 
    // code that parses response.body as buffer 
    // and calls resolve(data); when done 
    // or reject(err); on error 
    }) 
}; 

const binaryParser = require('superagent-binary-parser'); 

// test snippet 
request(app) 
    .get('/some/api/returning/pdf') 
    .expect(200) 
    .expect('content-type', 'application/pdf') 
    .parse(binaryParser) 
    .buffer() 
    .then(parsePDF) 
    .then((pdf) => { 
     chai.expect(pdf.pages.length).to.be.equal(5); 
    })