私のテストで悩んでいます。私のテストでは、クライアント(ブラウザ)がイメージのアップロードをキャンセルまたは中止したことを検出する必要があります。私の問題は、接続が中止されたときのシミュレーション方法です。私のコントローラでは、接続ループをシミュレートし、コードが適切に反応することを伝えています。しかし、私が言及したように、問題はテストからそれを引き起こす方法が残っています。 私はMocha 3.2.0をテストスイートとして使用し、コントローラ側ではmultipartyを使用します。シミュレーションする方法クライアントが中止されました
これは、元のコードは次のとおりです。
return new Promise((resolve, reject) => {
let form = new multiparty.Form();
let fileCount = 0;
form.on('part', function (part) {
fileCount++;
let tmpFile = path.join(os.tmpDir(), `${userId}_${timePrefix}_${path.basename(part.filename)}`);
part.pipe(fs.createWriteStream(tmpFile));
part.on('end',() => {
resolve(fs.createReadStream(tmpFile));
});
part.on('error', function (error) {
reject(error);
});
});
form.on('error', (error) => {
reject(new LogicalError(
`Image input request is not valid`, errorCodes.VALIDATION.IMAGE_UPLOAD_DATA_INVALID);
});
form.parse(request);
}).then((imageStream) => {
//AWS S3 is hendled here...
は今、私は、クライアントの接続がキャンセルされたことをトリガーする新しいケースを、追加しています。私は
Throttleを使用しました。スロットルは遅いアップロードをシミュレートし、タイムアウトで接続損失を引き起こします。
return new Promise((resolve, reject) => {
let form = new multiparty.Form();
let fileCount = 0;
let throttle = new Throttle(1); //1 = 1 byte. 1000 = 1kb... all per second
form.on('part', function (part) {
fileCount++;
let tmpFile = path.join(os.tmpDir(), `${userId}_${timePrefix}_${path.basename(part.filename)}`);
//part.pipe(fs.createWriteStream(tmpFile));
//Slows down the upload
part.pipe(throttle).pipe(fs.createWriteStream(tmpFile));
//trigger connection aborted
setTimeout(function() {
request.emit('aborted');
},10);
part.on('end',() => {
resolve(fs.createReadStream(tmpFile));
});
part.on('error', function (error) {
reject(error);
});
});
form.on('error', (error) => {
let err = null;
if (error.message.includes('Request aborted')){
err = new LogicalError(
`Client aborted image upload process`, errorCodes.VALIDATION.IMAGE_UPLOAD_CLIENT_REQUEST_ABORTED);
} else {
err = new LogicalError(
`Image input request is not valid`, errorCodes.VALIDATION.IMAGE_UPLOAD_DATA_INVALID);
}
reject(err);
});
form.parse(request);
}).then((imageStream) => {
//AWS S3 is hendled here...
このシミュレーションは期待どおりに機能します。コードは適切な条件を認識します(Request aborted)。 もちろん、このスロットルとsetTimeoutを離れることはできません。どのように私はテストからそれを引き起こすことができますか?
これは現在のテストで、画像をアップロードし、コントローラをターゲットにしています。私の第二の試み(上記のコードはある)で
describe('ImageControllerTest', function() {
it('should upload image with name for the given user', (done) => {
request(app)
.put('path-to-controller/test-image.jpg')
.attach('file', imagePath.testImagePath)
.set(cons.TOKEN.HEADERS)
.expect((res) => {
//series of expect statements.
})
.expect(200, done);
});
});
を、私はこれを行うことにより、接続中止をシミュレートしています:supertestを使用して
setTimeout(function() {
request.emit('aborted');
},10);
マルチパーティは、そのイベントに耳を傾け、それに応じて反応します。
どのようにすればテストできますか?