Feb 16, 2007

yieldをwait代わりに使っちゃっていいのかなー

MozLabの一機能の単体テスト用ツールMozUnitではasync型のテストケースを書くことができる、というのは前にここでも書いたんだけど、使い勝手の悪いポイント?が一つある。それは、テストケースの中で、ある処理が終わってから次の処理に進むといったことが簡単にはできないこと。

現状の仕様では、

  1. 共通の前処理(処理待ちできる)
  2. テストケース1(処理待ちできない)
  3. 共通の後処理(処理待ちできない)
  4. 共通の前処理(処理待ちできる)
  5. テストケース2(処理待ちできない)
  6. 共通の後処理(処理待ちできない)
  7. 共通の前処理(処理待ちできる)
  8. テストケース3(処理待ちできない)
  9. ...

という書き方しかできなくて、各テストケースの中でコールバック関数を使って準備が整うのを待つという使い方はできない。一般的な意味での単体テストというのがどうある「べき」なのかは知らないけど、やりたいこととしては、

  1. 共通の前処理(処理待ちできる)
  2. テストケース1(処理待ちできる)
  3. 共通の後処理(処理待ちできない)
  4. 共通の前処理(処理待ちできる)
  5. テストケース2(処理待ちできる)
  6. 共通の後処理(処理待ちできない)
  7. 共通の前処理(処理待ちできる)
  8. テストケース3(処理待ちできる)
  9. ...

の方が便利ですよね? ね?

んでscript.aculo.usユニットテストの機能ではwaitという機能を使って処理待ちができるそうだから、MozUnitステでscript.aculo.usを拡張機能の開発でも使えるようにせよ!という指令が須藤さんから下ったのだけれども。

なんか仕様があちこち違うから今までMozLabベースで作ってた物をこれ用にするにはscript.aculo.usのソースもガッツリ読まなきゃいけないっぽいし、どうもscript.aculo.usは複数のテストが同時に動くことを想定していなさそうな雰囲気だったので、MozReplみたいな機能を使って同時に複数人でテストするようなことは難しいっぽかった(そんな事ほんとにやるのかどうかはさておき)ので、新しいこと覚えるよりは今までの知識がそのまま使えた方が僕が楽だと思った。

ということでMozUnitのTescCaseクラスの定義をゴニョゴニョと書き換えて、JavaScript 1.7のジェネレータを応用し、テストケースの中で yield 5000; とか書くとそこで指定時間(ここでは5000ミリ秒=5秒)待ってから次の処理に進むということができるようにしてみた。テストケースの実行結果の返り値を見て、 [object Generator]である場合は、StopIteration例外が出るまでタイマー使って何度もnext()を実行して、それが済んでから次に処理を進めるようにした次第です。

……ということなんだけど、yieldってこんな使い方しちゃっていいのかしらん? yield(生産)って書いてるのに何も生産しとらんし。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能