2017-05-29 9 views
0

非同期呼び出しから返された配列をループしてテストを動的に生成しようとしています。私はこれを行う方法を理解できません - モカを使うか、または冗談を使うか。コードを使用して説明するために、次の同期の例では、動作します。その配列が非同期にフェッチされている場合JestまたはMocha:非同期初期化に基づいて動的にテストを作成する

describe("Test using various frameworks",() => { 
    ["mocha", "jest"].forEach(framework => { 
     it(`Should test using ${framework}`,() => { 
      expect(true).toBe(true); 
     }); 
    }); 
}); 

をしかし、私は配列は、それをループしようとする前にフェッチされるまで待つようにテストフレームワークを取得することはできません。

async function getFrameworks() { 
    //TODO: get it from some async source here 
    return ["mocha", "jest"]; 
} 

describe("Test using various frameworks",() => { 
    var frameworks; 
    //before() instead of beforeAll() if using mocha 
    beforeAll(async()=> { 
     frameworks = await getFrameworks(); 
    }); 

    frameworks.forEach(framework => { 
     it(`Should test using ${framework}`,() => { 
      expect(true).toBe(true); 
     }); 
    }); 
}); 

これは、Cannot read property 'forEach' of undefinedと表示されません。私はasync/awaitPromiseを使用し、doneコールバックを渡しても何の役にも立たなかった。

私が最も近かったのは、Mochaの--delayフラグを使用していましたが、問題の一部しか解決しませんでした。私の実際のユースケースで実際にやりたいことはbefore()またはbeforeAll()フックで非同期初期化を実行してから、テストを動的に生成することです。

mochaまたはjestを使用してこれを行うにはどのような指針がありますか?自分の質問に答えるために

答えて

0

、私はこの使用して冗談やモカを実行する方法を見つけることができませんでしたが、私はtap使用して、それを達成することができ - 私はbabel-tapを介して使用。

import tap from "babel-tap"; 

async function getFrameworks() { 
    //TODO: get it from some async source here 
    return ["mocha", "jest"]; 
} 

getFrameworks().then(frameworks => { 
    frameworks.forEach(framework => { 
     tap.test(`Should test using ${framework}`, (tester) => { 
      tester.ok("It works!"); 
     }); 
    }); 
}); 

さらに多くのことができます。たとえば、tester.test()をさらに呼び出して、ネストスコープを作成できます。また、tapにはbeforeafterなどの概念はありません(Mocha-like DSLを使用しない限り)ので、命令コードを使用して同等の動作をシミュレートすることができます。

また、async/awaitスタイルの呼び出しをテスト内で自由に使用できます。

関連する問題