我試圖從一個Ant構建腳本中使用PhantomJS獲取一組異步QUnit測試。我似乎正在努力,但似乎應該有一個更好的方法來實現它。在PhantomJS中從Ant運行異步QUnit測試
運行時PhantomJS負載是如下的腳本(簡化):
var page = require("webpage").create();
page.onConsoleMessage = function(msg) {
if(msg.indexOf("FINISHED") > -1) {
var failed = msg.split(" ");
phantom.exit(failed[1]);
}
};
page.open("testrunner.html", function() {
page.evaluate(function() {
QUnit.done = function(result) {
console.log("FINISHED " + result.failed);
};
});
});
這將加載包含測試(testrunner.html
)的文件。它使用PhantomJS evaluate
方法在加載頁面的上下文中運行一些代碼。該代碼將事件處理程序綁定到QUnit done
事件。在事件處理程序中,所發生的只是對console.log
的簡單調用。
PhantomJS在默認情況下不會對console.log
調用做任何事情,所以我還爲PhantomJS onConsoleMessage
事件綁定了一個事件處理程序。當執行QUnit.done
事件處理程序中的console.log
調用時,將觸發onConsoleMessage
事件。如果控制檯消息匹配給定的字符串,那麼我們知道測試已經完成。然後我們可以退出PhantomJS,退出代碼等於失敗單元測試的數量(Ant腳本使用它來確定這部分構建是否成功)。
我的問題是,有沒有更好的方法來找出單元測試何時完成運行?
謝謝,我還沒有看到。然而,它看起來非常像我已經在做的事情,只需將'onTimeEmptyMessage'回調切換到一個'setTimeout'循環,等待一些條件成立,或者等待一段時間才能通過。我真的想避免這樣的事情(例如1個問題 - 如果由於某種原因,請求花費的時間超過了允許的最大時間?)這就是爲什麼我使用了我使用的onConsoleMessage事件方法此時此刻。 – 2012-03-01 23:09:17
我同意,你的方法更簡潔,因爲你有知道你的測試完成的好處(給出'QUNIT.done'回調)。我可以看到'waitFor'方法對於不用的情況很有用,比如當你等待頁面上的元素可見時。我實際上在做一些與你在做什麼非常相似的事情,除了不是指向qunit測試頁面,而是指向我網站上的頁面,在頁面中注入我的qunit測試,以便我可以在頁面上進行集成測試HTML/JS。 – 2012-03-02 02:32:10