2017-05-29 110 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()鉤子中運行一些異步初始化,然後我使用它來動態生成測試。

任何關於如何使用摩卡或笑話這樣做的指針?

回答

0

要回答我自己的問題,我沒有找到一種方法來使用Jest或Mocha來做到這一點,但我可以使用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不具有before,after等概念(除非使用Mocha-like DSL),您可以簡單地使用命令式代碼來模擬等效行爲。

另外,您可以在測試中自由使用async/await樣式調用。