2016-10-20 1 views
4

jasmine 테스트에서 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에서 버퍼를 가져 왔습니다. 당신이 그걸 없애 버린다면 효과가있을 것입니다. 주의 할 점은 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); 
    }); 
});