2

app.boot の署名が異なるため、0.4.x ではlocomotive.js 0.3.x を起動する方法が機能しなくなりました。私は持っている:

before(function(done) {
  var self = this;
  var lcm = new locomotive.Locomotive();
  lcm.boot('test', function() {
    self.app = lcm.express;
    self.app.listen(4000, done);
  });
});

接続しようとすると、「エラー:接続ECONNREFUSED」がスローされsupertestます:

  request(this.app)
    .post('problems/' + problemId + '/solution_ratings')
    .set('Content-Type', 'application/json')
    .send({access_token: playerId, solution_group_id: 1, rate: 4})
    .expect(200, done);

機能テストのために機関車サーバーを起動する適切な方法は何ですか?

[更新] sinon.js を使用してモデルへのスタブ/スパイ呼び出しを行うには、テストと同じプロセスでサーバーを起動する必要があります。

4

1 に答える 1

-1

問題について Locomotive の github でこれに回答しましたが、より良い方法、よりクリーンな方法、またはその他の入力として、フィードバックを得るためにここで共有したいと思います。

OAuth2 環境 (認証、リソース、ダッシュボードなど) に複数のサーバーが必要です。そのほとんどは Locomotive フレームワーク ベースです。

私は機能テストが好きです。なぜなら、認証トークンがユーザーを最も適切に表していない可能性があるリソース サービスにのみテストを集中させるのではなく、OAuth2 ベースの認証を最もよく表しているからです。

機関車サーバーを起動するために私が思いついたセットアップは次のとおりです。

テストのために、次のように言いますtest/util.severs.js

var fork = require('child_process').fork,
    async = require("async");

var authApp;
var serverStatus = [];

var start = function(done) {

    authApp = fork( __dirname + '/../../authorization/server.js');
    serverStatus.push(function(callback){
        authApp.on('message', function(m){
            //console.log('[AUTHORIZATION] SENT MESSAGE: ', m);
            if (m.status == 'listening') return callback();
        });
    });

   // add others servers if you swing that way!

   async.parallel(serverStatus, function(){
         done();
   });
}
var stop = function(done) {
    authApp.kill();
    done();
}
module.exports = {
  start: start,
  stop: stop
};

ここでは複数のサーバーで作業しているため、ここで非同期を使用していることに注意してください (環境は OAuth2 にあり、起動には多くのサーバーが必要です (IE リソース、ダッシュボードなど))。サーバーが 1 つしかない場合は非同期を無視してください。 .

Mocha テストで上記のファイルを必要とし、実行します

servers = require('./util/servers');
...
before(servers.start);

  // tests away!!!

after(servers.stop);

次に、それぞれの locomotive-project/server.js で次のことを行います...

// if being started as a parent process, send() won't exist, simply define
//   it as console.log or what ever other thing you do with logging stuff.
if (process.send === undefined){
  process.send = function(msg){
    console.log("status: ", msg.status);
  };
}
process.send({status: 'starting'});
...
app.boot(function(err) {
  if (err) {
    process.send({status: 'error', message: err});
    return process.exit(-1);
  } else {
    // notify any parents (fork()) that we are ready to start processing requests
    process.send({status: 'listening'});
  }
});

ここで Locomotive 0.4.x を使用すると、バージョンによって異なる場合があります。

これが最善の方法ですか?理想的には、これを Grunt に移行したいと考えています。つまり、テスト サーバーの初期化 (テスト DB に大量のデータを構築するため、非常に手間がかかります) を行い、機能テストを実行できます。Mocha の before() タスクの代わりにこれを行うために誰かがうなり声を掘り下げたのではないかと思っています。

于 2014-04-30T22:21:29.790 に答える