2016-07-19 6 views
-1

私は、ユーザーがログインした後に実行されているsupertestとテスト実装しました:私はES5を使用してにそのmodule.exports.tokenとしてソートの醜いハックを使用した今までNode.jsのES6モジュール輸出非同期変数

// ../prepare.login 
"use strict"; 

import {default as request} from "supertest"; 
import {default as app} from "../../server.js"; 

const postUrl = "/api/v1/login"; 
const postData = { 
    "username": "user", 
    "password": "pass" 
    }; 

module.exports = { 
    prepare: function(done) { 
     request(app.listen()) 
      .post(postUrl) 
      .send(postData) 
      .end((err, res) => { 
       if (err) { 
        throw err; 
       } 
       module.exports.token = res.body.token; 
       done(); 
      }); 
    } 
} 

を実際の試験にトークンを送信します。

// users.js 
... 
var login = require("../prepare.login"); 

describe("authenticated /api/v1/users", function() { 
beforeEach(function(done) { 
     login.prepare(done); 
    }); 
}); 

... 

it("On GET /api/v1/users I want to get all the users in an array", function(done) { 
     request(app.listen()) 
      .get("/api/v1/users") 
      .set("X-Access-Token", login.token) 
      .expect(200) 
      ... 

私はモジュールのトップレベルよりもどこにもimportexport文を許可していませんES6に切り替えました。したがって、私はこれをどのように実装すべきかについて本当に分かりません。私は結果を非同期で待つべきですか?それも可能ですか?他の方法はありますか?

答えて

0

ES6はいどこか他のモジュールのトップレベルよりも

をインポートおよびエクスポートstatemensを許可していませんが、変数宣言をする必要がある場所それが唯一です。あなたはまだあなたが望むように彼らに割り当てることができます。

import {default as request} from "supertest"; 
import {default as app} from "../../server.js"; 

const postUrl = "/api/v1/login"; 
const postData = { 
    "username": "user", 
    "password": "pass" 
}; 

export let token = null; 
export function prepare(done) { 
    request(app.listen()) 
     .post(postUrl) 
     .send(postData) 
     .end((err, res) => { 
      if (err) return done(err); 
      token = res.body.token; 
      done(); 
     }); 
} 

import {prepare, token} from "prepare.login"; 
… 

他の方法はありますか?

はい。

let token = null; 
describe("authenticated /api/v1/users", function() { 
    beforeEach(function(done) { 
     login.prepare(function(err, t) { 
      if (err) return done(err); 
      token = t; 
      done(); 
     }); 
    }); 
}); 

があります:あなたがそれを必要な場所あなたはそれを抽出することができるように

… 
.end((err, res) => { 
    if (err) done(err); 
    else done(null, res.body.token); 
}); 

:代わりに(歳以降軽蔑)グローバル変数を変異の、あなたではなく、コールバックにtokenを渡す必要がありますさらに良い方法ですか?

第2のアプローチと同様に、エクスポートされた変数は使用しないでください。面倒なコールバックを呼び出す代わりにトークンの約束を返すだけです。

関連する問題