Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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

Feel-Physics
今はHoloLensのアプリを開発しており、技術記事はすべてブログ( http://weed.nagoya )に書いています。以前はSwift、OpenCV+Python、JavaScript、Objective-Cを書いていました。
http://feel-physics.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away