2014-11-17 26 views
3

我有一個角度的web應用程序,對於通過長查詢從後端通知持續監聽:量角器測試VS長輪詢

scope.notification = $resource('/notification').get(); 

這個請求從來沒有在測試環境中完成。對於量角器來說這是一個問題,因爲它希望等待所有未完成的HTTP請求完成。

我看到了很多潛在的解決方案,但都有一些問題。

我沒有看到告訴量角器忽略此請求的方法。從$interval(它本身被忽略)發出它不是一個解決方案。量角器不會等待請求發送,但一旦發送,它仍然會等待它完成。

所以我試圖在運行測試時不發送這個請求。但是我怎麼知道我正在進行測試?

  • 我可以添加一個標誌到URL(?protractor=true)。但是我的網絡應用程序一直在修改URL,所以它會很快清除。
  • 我試着設置一個變量:browser.executeScript('window.runningProtractorTests = true;');但是看起來Protractor在運行executeScript之前會先等待頁面同步。我在頁面加載時馬上發送請求。
  • 我可以設置一個cookie。但它相當麻煩,例如我必須加載頁面兩次。 (有關更多困難,請參閱issue 341。)
  • 我可以設置用戶代理。這也不容易。我需要爲配置文件中的每個瀏覽器設置瀏覽器標誌。我不想完全覆蓋用戶代理(例如,以Protractor爲例),因爲擔心我的庫可能依賴於解釋用戶代理字符串,所以我必須找出正確的字符串。
  • 我可以檢查服務器是否在特定的端口上運行。但是從現在開始一年後,有人會嘗試在同一端口上運行生產服務器,但不明白通知無法正常工作的原因。
  • 讓測試後端立即完成請求並沒有什麼幫助,因爲每當它完成後立即發送它。但我想我可以介紹一個特殊的「你正在測試」通知,並在收到此通知時停止輪詢。這意味着對協議的(小)改變,所以如果可能的話,我寧願避免它。

有沒有簡單的方法來做到這一點?

回答

4

您可以將撥打$resource的電話轉換成您使用量角器browser.addMockModule()進行模擬的服務嗎?這樣,量角器將在它有機會運行之前始終覆蓋原有的服務。

這可能看起來像

// in your application 
myModule.service('myNotificationService', function($resource) { 
    this.notification = $resource('/notification').get(); 
}); 

// In your Protractor test 
browser.addMockModule('notificatonOverride', function() { 
    angular.module('notificationOverride').service('myNotificationService', function() { 
    this.notification = {}; // or whatever you need here. 
    }); 
}); 
+0

謝謝!這聽起來不錯,明天我會試一試。我不知道'addMockModule' ...它看起來非常強大。 –

+0

確實有效! –

1

嘗試使用browser.driver.get('http://myapp')加載視圖。直接調用webdriver API將不會等待角度準備就緒。

然後你可以運行腳本。

browser.driver.executeScript('window.runningProtractorTests = true;'); 

然後繼續使用量角器api。

您可能需要添加browser.waitForAngular()以確保在繼續進行測試之前角度已準備就緒。

+0

好主意,謝謝!有沒有這種比賽的機會?它會在Web應用程序初始化之前始終運行嗎? (我實際上已經讓後端告訴前端它是一個測試,所以我不想再試驗了。) –

+0

希望它能在量角器初始化之前運行,但我不會指望它。下次見面時(本週),我會要求量角器團隊。也許他們有一個建議來解決你的問題。 –

+0

哇,真棒,謝謝!告訴他們量角器是天才:)。 –