2016-10-20 10 views
4

ジャスミンテストでmultipart/form-dataペイロードを作成するためにstream-to-promise npmモジュールを使用しています。私のペイロードにはバッファとしてのイメージファイルが含まれていますが、ペイロードがstream-to-promiseに置かれると、何らかの形でペイロード内に元のイメージバッファが変更または破損してしまい、テストが失敗します。これを防ぐ方法はありますか?私の元のバッファを変更するストリームを約束する方法を停止する方法

it('test /identity-verification/your-first-form-of-id POST with validation passing', function(done){ 
    var form = new FormData(); 
    var image = fs.createReadStream("image.png"); 
    streamToBuffer(image, function (err, buffer) { 
     form.append('firstID', 'passport'); 
     form.append('firstIDImage', buffer); 
     var headers = form.getHeaders(); 
     streamToPromise(form).then(function(payload) { 
     var options = { 
      method: 'POST', 
      url: '/identity-verification/your-first-form-of-id', 
      payload: payload, 
      headers: headers 
     }; 
     server.inject(options, function(response) { 
      expect(response.statusCode).toBe(302); 
      expect(response.headers.location).toMatch('/identity-verification/your-first-form-of-id/upload-successful'); 
      done(); 
     }); 
     }); 
    }); 
    }); 

ストリームツー約束に通された後、ペイロード内のバッファは次のようになります。

+0

buffer.toString()をログに記録していますか?それは、おそらく、奇妙なキャラクターを説明するでしょう。テストが失敗したときに表示されるエラーメッセージは何ですか? –

+0

私はハンドラ関数内にrequest.payloadを記録しています。私のハンドラでは、バッファからファイルタイプを読み込もうとしていますが、バッファが壊れているか見えていないため、テストが失敗しています – Ruth

+0

ファイルタイプを読み込むために使用しているロジックを投稿できますか? –

答えて

1

あなたは、ストリーム・ツー・バッファを必要としません。すでにcreateReadStreamからバッファを取得しています。あなたがそれを取り除くなら、それはうまくいくはずです。注意しなければならないことの1つは、maxBytesがテストイメージに対応できるように十分に高く設定されていることです。これは私がテストしていたときにいくつかの謎めいたエラーを引き起こしていました。

以下のコードは問題なく機能しています。

var streamToPromise = require("stream-to-promise"); 
var FormData = require("form-data"); 
var fileTypeModule = require("file-type"); 
var fs = require("fs"); 
var q = require("q"); 
var Hapi = require('hapi'); 
var server = new Hapi.Server({ debug: { request: ['error'] } }); 

server.connection({ 
    host: 'localhost', 
    port: 8000 
}); 

server.route({ 
    method: 'POST', 
    path: '/test', 
    handler: function(request, reply) { 
     var data = request.payload.firstIDImage; 
     var fileType = fileTypeModule(data); 
     reply(fileType); 
    }, 
    config: { 
     payload: { maxBytes: 1048576 } 
    } 
}); 

var start = server.start(); 
var form = new FormData(); 
var headers = form.getHeaders(); 

form.append('firstID', 'passport'); 
form.append('firstIDImage', fs.createReadStream("image.png")); 
var append = streamToPromise(form); 
q.all([start, append]).then((results) => { 
    var options = { 
     method: 'POST', 
     url: '/test', 
     payload: results[1], 
     headers: headers 
    }; 
    server.inject(options, function(response) { 
     console.log(response.payload); 
    }); 
}); 
関連する問題