2017-07-03 2 views
1

私のテストで悩んでいます。私のテストでは、クライアント(ブラウザ)がイメージのアップロードをキャンセルまたは中止したことを検出する必要があります。私の問題は、接続が中止されたときのシミュレーション方法です。私のコントローラでは、接続ループをシミュレートし、コードが適切に反応することを伝えています。しかし、私が言及したように、問題はテストからそれを引き起こす方法が残っています。 私は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); 

マルチパーティは、そのイベントに耳を傾け、それに応じて反応します。

どのようにすればテストできますか?

答えて

1

簡単な方法は、することができます - 使用してサブプロセス内のクライアントを作成する:あなたがキャンセルトリガする必要がある場合

const fork = require('child_process').fork; 
const path = require('path'); 
const child = fork(path.join(__dirname, './some-sub.js')); 

をと - ちょうどプロセスを閉じる:

child.close(); 

またはプロセス自体から:

process.exit(0); 
関連する問題