2017-03-21 9 views
1

私のアプリの単体テストを作成したい。 APIはブラウザから呼び出すときにうまく動作しますが、npm testまたはmocha testのどちらかでテストを実行する場合、コールバック関数は呼び出されず、INSERT文は実行されません。私は間違いがない。コード:Nodejs mocha unit test sqlite3コールバックが呼び出されず、挿入が実行されない

ユニットテストファイル:

process.env.NODE_ENV = 'test'; 
var chai = require('chai'); 
var chaiHttp = require('chai-http'); 
var server = require('../server/server'); 
var Const = require("../config/const.js"); 
var should = chai.should(); 
chai.use(chaiHttp); 
var assert = chai.assert; 

var column1value = "123456789" 

describe('All', function() { 
    it('Insert',function(done) { 
     chai.request(server) 
     .post('/' +Const.SERVER_NAME + '/insert') 
     .set('content-type', 'application/x-www-form-urlencoded') 
     .send({param1: column1value, param2: 'true'}) 
     .end(function(err, res){ 
      console.log(new Date().getTime() + "!1"); 

      res.should.have.status(200); 

      done(); 
     }); 
    }); 
}); 

データベース・マネージャーの挿入方法:

:私は "NPMテスト" や "モカテスト" を実行したとき、私はコンソール出力に何を得る

method.insert = function(param1, param2) { 
openDb(); 

console.log("blabla1"); 
console.log("param1:" + param1 + ";param2:" + param2); 

db.run("INSERT INTO mytable (column1, column2) values (?,?)",param1,param2, function(err) { 

    console.log("blabla2" + this); 

    if (err) { 
     console.log(err); 
    } else { 
     console.log("Successfuly updated: " + param1); 
    } 
}); 

db.close(); 

console.log("blabla3"); 
}; 

blabla1
param1:123456789; param2:true
blabla3
タイムスタンプ!1

私がnodejsサーバーを起動し、郵便配達員を使って挿入を呼び出すAPIを呼び出すと、データがデータベースに挿入され、blabla2ログが表示されます。 私は行方不明ですか?

UPDATE
問題はアレクサンドル・オラルが書かれたものに関連しているが、より具体的には、私はindex.jsでやっていた(ここで、私のルートがある)

function insertOrUpdateData(req, res) { 
    databaseManager.insert(req.body.param1, req.body.param2); 
    res.end(); 
    return; 
}; 

が、私は必要行うには:

function insertOrUpdateData(req, res) { 
    databaseManager.insert(req.body.param1, req.body.param2, function (err) { 
     logger.log("*-*-router insert callback"); 
     res.end(); 
     return; 
    }); 
} 

問題は、今私が理解からだけのユニットテストで再現性のある非同期タスクは結局ノードで実行されるためですが、Uで、なぜ関連ニットテストではありません。なぜ単体テストではないのですが、私はまだ確実ではありません(単体テストライフサイクルやノードインスタンスとの相互作用に関係する可能性があります)。

+2

db runは非同期呼び出しです... a)この関数から約束を返すか、b)関数のコールバックを渡す必要があります – LostJon

+1

あなたの動作は非同期の問題のようです。なぜそれが郵便配達員vのチャイで、私は知っている...多分その競争の問題 – LostJon

+0

、https://github.com/mapbox/node-sqlite3#usageを点検しなさい。彼らは、非同期の問題を避けるために、その例ではコードのシリアライズブロックを呼び出します。 – LostJon

答えて

1

コールバックや約束を使用するようにコードをリファクタリング:

method.insert = function (param1, param2) { 
    return new Promise((resolve, reject) => { 
    openDb(); 
    db.run('INSERT INTO mytable (column1, column2) values (?,?)', param1, param2, (err) => { 
     db.close(); 
     if (err) { 
     reject(err); 
     } else { 
     resolve(); 
     } 
    }); 
    }); 
}; 

handler.insert(param1, param2) 
    .then(() => { // the stuff after }) 
    .catch((err) => { // handler error }); 

問題は、あなたが非同期パートのコールバックを設定していないという事実であるが。

関連する問題