LoginSignup
8
9

More than 5 years have passed since last update.

非同期Nodeアプリケーションのテスト

Last updated at Posted at 2015-01-05

asyncモジュールを使った非同期Nodeアプリケーションのテスト方法を模索してみました。

とりあえず以下のようにしたら動きましたが、何かツッコミあれば下さい。

まず、アプリケーションですが、

  1. 指定したURLの画像ファイルをダウンロードし、
  2. そのファイルをGoogle Driveにアップロードし、
  3. 新しいURLを取得する

というものです。

argFtuで渡しているのは、まるごとftuインスタンスそのものです。

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です。

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の中で無効化しています。

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

8
9
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
9