1. Feel-Physics

    Posted

    Feel-Physics
Changes in title
+非同期Nodeアプリケーションのテスト
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,89 @@
+asyncモジュールを使った非同期Nodeアプリケーションのテスト方法を模索してみました。
+
+とりあえず以下のようにしたら動きましたが、何かツッコミあれば下さい。
+
+まず、アプリケーションですが、
+
+1. 指定したURLの画像ファイルをダウンロードし、
+2. そのファイルをGoogle Driveにアップロードする
+
+というものです。
+
+`argFtu`で渡しているのは、まるごと`ftu`インスタンスそのものです。
+
+```js:app.js
+var async = require('async');
+var fileToUpload = require('./FileToUpload.js');
+var ftu;
+
+async.waterfall([
+ function (callback) {
+ /*** At first, download image file ***/
+ ftu = new fileToUpload.FileToUpload('http://xxx.com/xxx.jpg', callback);
+ },
+ function (argFtu, callback) {
+ /*** Secondary, upload the image file to Google Drive ***/
+ argFtu.uploadToGoogleDrive(callback);
+ },
+ function (argFtu, callback) {
+ console.log(argFtu.newUrl);
+ callback(null, 'done');
+ }
+]);
+```
+
+この`FileToUpload`クラスをテストします。テストのフレームワークは**Mocha + expect.js**です。
+
+```js:test.js
+var fileToUpload = require('../FileToUpload.js');
+var ftu;
+
+describe('FileToUpload', function () {
+ beforeEach(function (done) {
+ var callback = function () {};
+ ftu = new fileToUpload.FileToUpload('http://xxx.com/xxx.jpg', callback, done);
+ });
+
+ it('ファイルをアップロードすることができる', function (done) {
+ var callback = function () {};
+ expect(ftu.uploadToGoogleDrive(callback, done)).to.be.a('string');
+ });
+});
+```
+
+テストでは、**async**モジュール用の`callback`関数はいらないので、`function () {}`を突っ込みます(もっと良い書き方があれば教えて下さい)。
+
+それでも非同期テストのために`done()`が残るので、**FileToUpload.js**の中で無効化しています。
+
+```js:FileToUpload.js
+ ...
+
+ file.on('finish', function () {
+ file.close(function () {
+ console.log('File download is done\n');
+ callback(null, _this); // for async module
+ if (done != null) {
+ done(); // for mocha async testing
+ }
+ });
+ });
+
+ ...
+
+ }, function (err, response) {
+ _this.newUrl = response.webContentLink;
+ _this.newUrl = _this.newUrl.replace('&export=download', '');
+ callback(null, _this); // for async module
+ if (done != null) {
+ done(); // for mocha async testing
+ }
+ return _this.newUrl;
+ });
+
+ ...
+```
+
+これで、アプリケーションもテストも(いちおう)正常に動きます。
+
+---
+ブログやっています:[Weed software](http://weed.cocolog-nifty.com/wzero3es/)