mochaフレームワークの下で、非同期テストコードエラーによる問題---使用例タイムアウトエラー

4030 ワード

今日は抹茶(mocha)でテストをしましたが、いつもタイムアウトしているテスト項目がありました.
describe("DbFactory functions",function(){  
        it("query tables should return more than 0 rows",function(done){
            this.timeout(5000);            
            db.execQuery("show tables").then(function(data){   
          // , data.data。 data.rows.length.should.greaterThan(
0); done(); },function(err){ done(err); }); }); });

上記のコードの実行結果は、タイムアウトによるエラーのみです.
 4 passing (5s)
  1 failing

  1) DbFactory DbFactory functions query tables should return more than 0 rows:
     Error: timeout of 5000ms exceeded
      at null. (/var/node-v0.10.28-linux-x64/lib/node_modules/mocha/lib/runnable.js:158:19)
      at Timer.listOnTimeout [as ontimeout] (timers.js:110:15)

timeoutをもっと長く設定しても始まらないし、コマンドはmysqlで即時に返されるので、タイムアウトの問題ではないようです.
テストオブジェクトDbFactoryでqのpromiseオブジェクトが使用されているため、defererオブジェクトがずっとトリガーされていないのではないかと疑い始め、デバッグ後にdefererオブジェクトに問題がないことが判明し、resolveもトリガーされた.
故意にエラーを引き起こした結果、エラー処理はすぐにテストが完了することができ、問題はありません.紆余曲折の末、shouldテストの対象の属性が間違っていることに気づき、rowsではなくdataであるべきで、修正した後、テストはすぐに合格した.
  5 passing (184ms)

 
mochaは非同期モードでコードのエラーを捕まえていないように見えます!バグかどうか分かりません.その後、テストコードにtry catchを加えると、エラーが検出されます.
注:後で真剣に考えてみると、確かにmochaの問題ではありません.非同期方法の異常は捕まえられません.nodeの問題とは言えません.これは非同期プログラミング方式の痛みでしょう.
describe("DbFactory functions",function(){  
        it("query tables should return more than 0 rows",function(done){
            this.timeout(5000);            
            db.execQuery("show tables").then(function(data){
                try{//  
                  data.rows.length.should.greaterThan(0);                    
                  done();
                }catch(err){done(err);}
            },function(err){
                done(err);
            });        
        });   
});

コードが変更されると、エラーメッセージが表示されます.
  4 passing (207ms)
  1 failing

  1) DbFactory DbFactory functions query tables should return more than 0 rows:
     TypeError: Cannot read property 'length' of undefined
      at /home/gzg/nodeDev/dzfu/test/dbFactory.test.js:22:26
      at _fulfilled (/home/gzg/nodeDev/dzfu/node_modules/q/q.js:794:54)
      at self.promiseDispatch.done (/home/gzg/nodeDev/dzfu/node_modules/q/q.js:823:30)
      at Promise.promise.promiseDispatch (/home/gzg/nodeDev/dzfu/node_modules/q/q.js:756:13)
      at /home/gzg/nodeDev/dzfu/node_modules/q/q.js:564:44
      at flush (/home/gzg/nodeDev/dzfu/node_modules/q/q.js:110:17)
      at process._tickCallback (node.js:419:13)