2017-10-17 14 views
0

を失敗した後、私はモカは、アサーションが失敗した後、私は私がしようと使用しようとした、アサーションが失敗した後に何かをやって継続する必要があり、このモカフロー制御アサーションが

it('test', function(done) { 
    a.should.equal(b); 
    //if a is not equal to be, won't go here 
    //do something 
    done(); 
} 

のように、現在のテストケースの実行を停止だと思う...キャッチ、しかし、キャッチには「他」が存在しないので、私は

try { 
    a.should.equal(b) 
} catch(e) { 
    console.log(e) 
    done(e) 
} finally { 
    //do something 
    done() 
} 

をすれば、これは(行わ呼び出します)を2回、私はフラグを追加する必要が

var flag = true; 
try { 
    a.should.equal(b) 
} catch(e) { 
    console.log(e) 
    flag = false 
    done(e) 
} finally { 
    //do something 
    if(flag) 
     done() 
} 

これはとても複雑だと思うので、もっと簡単な方法があるのだろうか?

答えて

0

テストが失敗したときに、このようなフックを持っているコンテキスト内でテストを置くことができるようにafterフックはまだ、呼び出されます:

describe('suite', function() { 

    after(function(done) { 
    // do something 
    done(); 
    }); 

    it('test', function(done) { 
    a.should.equal(b); 
    done(); 
    } 

}); 
+0

実際には各テストケースが終了した後にやりたいので、afterEach()を使用するかもしれませんが、 "do something"は各テストケースとは異なるので、私はこれを使うことはできません。 – Keming

+0

@KemingZengあなたは 'describe'ブロックをネストすることができるので、テストごとに1つを作成し、それぞれに' after'フックを付けることができます。 – robertklep

+0

私はそれを行う別の方法を使用しますが、私はアフターフックがこれに対する良い解決策であるべきだと思います。ありがとうございました! – Keming

0

catchが例外を処理しているが、アサーションがエラーをスローした場合finallyブロックは常にに関係なく実行されますので、それは二度呼ばれている理由があります。

returnを使用してシナリオを処理します。例外が検出された場合はエラーが発生して終了します。それ以外の場合はキャッチはスキップされ、ただちにreturn done()がスキップされます。

if/elseシナリオで使用する必要がある場合は、変数で処理できます。

var theError = false; 
try { 
    // test assertion 
    a.should.equal(b) 
} catch(e) { 
    // indicate we caught an error 
    console.log(e) 
    theError = e 
} 

if (theError) { 
    // there was an exception 
    done(theError) 
} else { 
    // no exceptions! 
    done() 
} 
+0

は、私は最初は容易になるだろうと思います、ありがとうございます。だからモカはこれに何もない? – Keming

+0

モカにはこれがあります - 2つの例を見てください:)それは他のもののようなライブラリですが、あなたはまだその周りにジャバスクリプトを書く必要があります。 – doublesharp

+0

私は両方の例が有効であることを意味しましたが、特定の状況に基づいてそれぞれが適切かもしれません。特定のニーズに合わせて設計する必要があります。 – doublesharp

0

最終的には失敗するか失敗しないかを覚えておいてください。それがdoneを2回実行する理由です。

You can do: 

    try { 
     a.should.equal(b) 
    } catch(e) { 
     console.log(e) 
     done(e) 
    } 
    done() 

失敗した場合はキャッチを終了します。それ以外の場合は正常に戻ります。