2010年2月6日土曜日

JSSpec + jsDeferredどうしよう?(動機編)

このエントリーをブックマークに追加 このエントリーを含むはてなブックマーク
当たり前なんですが、このテストは意図に反して成功します。なぜならnextに与えている関数はたぶん1つも実行されないためです。最後nextで呼び出されるはずのshould_beは実行されません。。通る前にテストが終わってしまうのです。

マルチスレッドでいうところの「待ち合わせ」が必要なのです。Deferredの中のキューをのぞき見て、非同期のリクエストがすべて完了したことを見計らってテストから抜けてもらわないといけないのですが、ユーザ側でなんと化しようとするとyieldとかが無いとたぶん無理でそれはJSの標準にはありません。もしくはJSSpecになんらかのpatchを当てて待ち合わせるように書き直す必要があるのです。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>jsboard.jy JSSpec results</title>
<link rel="stylesheet" type="text/css" href="../JSSpec/JSSpec.css" />
<script type="text/javascript" src="../JSSpec/diff_match_patch.js"></script>
<script type="text/javascript" src="../JSSpec/JSSpec.js"></script>

<script type="text/javascript" src="http://www.google.com/jsapi"></script>
<script type="text/javascript">// <![CDATA[
google.load("jquery", "1.4.0");
// ]]></script>
<script type="text/javascript" src="../jsdeferred/jsdeferred.jquery.js"></script>
<script type="text/javascript">// <![CDATA[
describe('async', {
        'before': function() {
                target = {};
        },
  'テスト' : function (){
  var x = 0;
  var d = Deferred.define();
  d.next(function (){
    x =1;
  })
  .wait(1000)
  .next(function(){
    value_of(x).should_be(1);
    value_of(x).should_be(0);
  });
  }
});



// ]]></script>
</head>
<body><div style="display:none;"><p>A</p><p>B</p></div></body>
</html>

0 件のコメント: