LoginSignup
0
0

More than 5 years have passed since last update.

mocha:before 内で API を好きなだけ直列できるスニペット

Posted at

デグレった

うわー!ってなって、やっぱテスト書こうよーって音頭取ってやってみたのでメモ。いわゆる一つのカッとしてやった系です。

道具立て

社内 proxy 経由で API 叩ければいいので、普通です。あと coffee ではなくピュアな js です。

  • mocha
  • should
  • request

問題

テストする前に、DB をきれいにしておきたい。でも、直接 DB には触れないので、テストする API とは別に DB が用意してくれてる API を叩きたい(いわゆるひとつの ArangoDB)。

でも、そうすると非同期だから完全に待つようにしないとだよね。まあ、before で done を取れるからそこは問題ない・・・はずが、before でいろいろ初期化したい → たくさん Arango 叩きたい → コールバック地獄(今更感)・・・という展開に。

どうする?

このご時世、非同期ライブラリなんざたくさんあるし好きなの使えばいいじゃんついでに最新トレンド学ぶいい機会だし一挙両得winwin~と思ったけど、ふと、Nightmare を拡張した時のことを思い出して、継続取るだけだし単機能だから簡単に自作できるんじゃない?っていつものように独りごちたら「You、やっちゃいな Yoda!」って声が聞こえた(どうかしてる)ので書いてみたら 10 分もかかってしまった(そんな目で見ないで!)のはフォースが足りないのです、明らかに。

var cascade = function (finish) {
  var queue = [];
  var next = function (err) {
    if (err) throw err;

    if (queue.length) {
      queue.shift().call(this, next);
    } else {
      finish();
    }
  };
  return {
    run: function () {
      queue = [].slice.call(arguments);
      next();
    }
  };
};

使い方

処理の最後に引数 done を呼び出す関数の参照を好きなだけ好きな順序で渡せば良い。同期に非同期は混ぜられない。そんな複雑なことはできないしフォースが足りない。

var async = function (done) {
  setTimeout(function () {
    console.log("async");
    done();
  }, 1000);
};

var finish = function () {
  console.log("finish!");
};

cascade(finish).run(
  async,
  async,
  async
);

console.log("start");

って書けば

start
async
async
async
finish!

となる。途中で失敗するような、

var fail = function (done) {
  done(123);
};

cascade(finish).run(
  async,
  fail,
  async
);

みたいなパターンも

start
async
ここで例外発生

となってちゃんとコケる。良い。かわいい。

まとめ

  • ちゃんとした非同期ライブラリ使おう
  • スターウォーズ観よう(棒読m)
0
0
0

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
0
0