2017-06-01 9 views
0

モカ単位テストを作成しようとしている多くの関数型ジェネレータを含むオブジェクトがあります。しかし、Mochaは関数を呼び出すことはありません。私は解決策が何であるかを理解するのに苦労しています。ここでオブジェクト内に関数ジェネレータを呼び出さないモハ単位のテスト

は、いくつかのサンプルコードです:

'use strict'; 

var ctr = { 
     fn: function(arg,cb) { 
       console.log('arg:', arg); 
       var err = (arg == true); 
       return cb(err, arg); 
     } 
}; 

describe('Mocha test', function() { 
     it('should call the function', function(done) { 
       console.log('a'); 
       ctr.fn(false, function(err,data) { 
         console.log('b'); 
         if(err) return done(err); 
         console.log('c'); 
         done(); 
         console.log('d'); 
       }); 
       console.log('e'); 
     }); 
}); 

私は$ mocha testfile.jsを実行すると、私はこの出力を得る:

Mocha test 
a 
arg: false 
b 
c 
    ✓ should call the function (39ms) 
d 
e 
    1 passing (172ms) 

期待通りにすべてです。私は$ mocha testfile.js結果を実行している「fn: function*(...」、と「fn: function(...」交換する場合しかし、:

Mocha test 
a 
e 
    1) should call the function 


    0 passing (2s) 
    1 failing 

    1) Mocha test should call the function: 
    Error: Timeout of 2000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. 

は、私はこのMocha pluginで答えを見つけたと思ったが、mocha -r mocha-plugin-co testfile.jsを実行すると、それを指定しないと同じ結果になります。

私は「プロミスが解決することを確認する」必要があると思いますが、それはどういう意味か分かりません。私は[意図的に] Promisesを使用していませんが、私が使用しているnpmパッケージでは、このフォームで定義されている関数が必要です。

私がここで期待しているようにモカを動作させる簡単な解決法がありますか、またはすべてのコードを通常の機能に変更して何も壊れないことを願っていますか?

答えて

1

あなたはこのような返された発電機にnext()メソッドを呼び出す必要があります:

describe('Mocha test', function() { 
     it('should call the function', function(done) { 
       console.log('a'); 
       ctr.fn(false, function(err,data) { 
         console.log('b'); 
         if(err) return done(err); 
         console.log('c'); 
         done(); 
         console.log('d'); 
       }).next(); 
       console.log('e'); 
     }); 
}); 

をためには、ユーザーにblakeembrey/co-mochaプラグイン、あなたは実行を継続するために、あなたの発電機でyieldを使用する必要があります。

+0

うん、それは動作します。しかし、より多くの説明が役立つでしょう。関数*はジェネレータを返します。ジェネレータは特別な型のイテレータです。 .next()は関数からの戻り値と任意の 'yield'を取得します。私はモカがなぜぶら下がっているのかよく分かりませんし、MDNの機能に関する記事は明確ではありません。 正しいモジュールリンクを見つけて投稿していただきありがとうございます。私はそれを投稿したときにまだ多くのタブを開いていました... –

関連する問題