2016-05-19 6 views
0

ユニットテストをしたい。 この関数では、私はCoをジェネレータ関数で使用しています。 エラーが、私はそれをキャッチし、私は偽の主張を作る私のユニットテストでエラージェネレータ機能を使用したモカテストのサイレントエラー

でCBを呼び出すが、モカが、それだけの時間外に、それを報告しませんが発生した場合:明らかに

//function to test 

function start(data, cb) { 
    co(function * coStart() { 
    yield Promise.reject('err'); // yield error for sake of demo 
    }).then(function(result){ 
    return cb(null, result); 
    }).catch(function (err) { 
    // we get here 
    return cb(err); 
    }); 
} 

// mocha test 

it('fails on incorrect data', function(done){ 
    MyModel.start({'foo': 'bar'}, function(err, res){ 
    assert.equal(err, 'err2'); //this fails but mocha just stops here and times out 
    done(); 
    }); 
}); 

私はここで何か間違っていますか?

私はあなたがモカに約束を返却し、テストで行われ、コールバックを省略することができます知っているが、それは、コールバック

答えて

1

あなたのコードで動作する必要がありますので、私の関数「スタート」の約束、そのようなミドルウェアを返すことはできません。

Promise.reject('err') 
     .catch(() => { 
     // throw another exception 
     throw 'foo'; 
     }); 

です:これに似たようなん.catch()句の中に、別の例外がスローされるため、によって(を取り扱いしておりません同期、(、あなたのケースではassert.equal(err, 'err2')によってスローされた例外)、インスタンス、別の.catch()句)。これにより、2番目の例外が無視されます(説明はthis answerを参照してください)。しかし、テストケースが終了するのを止めます(done()に到達しないため、テストケースをタイムアウトします)。

あなたが本当にサポートコールバックが必要な場合、あなたはどちらかstart()に別の.catch()句を追加、または非同期のコールバックを呼び出してことでこの問題を回避することができます

return setImmediate(function() { cb(null, result) }); 
... 
return setImmediate(function() { cb(err) }); 
... 

しかし、理想的に、あなたはコールバックを除去する可能性を検討すべきです完全にサポートし、約束を守るだけです。モカは箱から約束をサポートしているので、コードは次のようになります。

function start(data) { 
    return co(function * coStart() { 
    yield Promise.reject('err'); 
    }); 
} 

it('fails on incorrect data', function(){ 
    return start({'foo': 'bar'}).then(function() { 
    throw new Error('should not be reached'); 
    }, function(err) { 
    assert.equal(err, 'err2'); 
    }); 
}); 
+0

Thx man、私はついにこれを手に入れました! setImmediateが動作します。これを使用することには何か意味があります。なぜなら、通常のフローをハックするような気分になるからです。 – Ernie

+1

代わりに使用できる['dezalgo'](https://github.com/npm/dezalgo)よりクリーンなコードを提供する可能性があります。私は自分自身で「完全な約束」の解決策を望んでいますが、それはいつも選択肢ではないことを認識しています。D – robertklep

+0

Thx!確かめます – Ernie

関連する問題