可能無法使用Karma執行此方案。我會理解Karma是如何工作的,它如何與Webdriver相比,以及實現這種情況需要做什麼。
首先,重要的是要記住,噶瑪和角度場景不是一回事。 Karma是運行基於瀏覽器的測試的通用shell。它啓動瀏覽器進程,啓動節點以提供包含測試工具的網頁,通過在WebSocket上發送命令來運行測試,然後收集結果。關於運行測試的實際線束/框架是不可知的。它具有Angular場景運行器(用於Angular e2e測試),Jasmine(常用於Angular單元測試)和其他流行的JavaScript測試框架的適配器。
測試運行程序(如Jasmine)在與測試代碼相同的窗口上下文中執行,這就是爲什麼它對單元測試有用。相反,Angular情景分析人員與被測試系統有着密切的關係。它將整個應用程序加載到一個iframe中,然後在大多數情況下模擬用戶事件並測試暴露的DOM元素的斷言。
由於場景跑步者通過iframe邊界與應用程序交互,因此受瀏覽器的同域策略限制。無法爲http://localhost:8000
上的場景運行者提供服務,然後在iframe中加載http://yourapp
,然後在該iframe內觸發事件。
解決此問題的一種方法是將場景運行器簡單託管在與應用程序相同的服務器上。下面是一個簡單的例子:
http://plnkr.co/edit/rfqpSq?p=preview
臨時抱佛腳一個測試運行到應用程序中不是很令人滿意,雖然。 Karma通過內置的HTTP代理爲您解決這個問題。您可以將Karma配置爲代理任意數量的不同服務器,以使它們看起來都來自同一個來源。簡單地將它們添加到配置文件的proxies
部分:
proxies = {
'/': 'http://yourapp/',
'/service/': 'http://service/'
}
這使您的端對端測試跨域,但美中不足的是,當域的傳送通過表單提交時或重定向,它有請訪問代理網址。否則,場景運行者將失去對iframe的控制,並且將無法繼續測試。
請注意,Selenium Webdriver不具備此限制。它運行於以上的個別瀏覽器窗口的級別,所以它不受同一域名政策的約束。
讓我們來看看您的具體情況。在實際的HTTP請求和響應方面,我假定這是要鍛鍊流量:
- 從
http://yoursite/yourapp.html
- 用戶負載的應用程序提交表單,看起來像:
<form method="POST" action="http://service/remotesubmission">
...your form...
<input type="submit">
</form>
- 提供商X處理遠程POST,然後在重定向到一種形式:
<form method="POST" action="http://service/nextsubmission">
...provider's form...
<input type="submit">
</form>
- Provider X處理表單POST,然後重定向回您的appp。
如果這是實際的情況,那麼我認爲,只有這樣,你能與噶和角場景亞軍這項工作將是:
- 條件化表單中的操作URL等等它在測試時指向外部服務的代理URL。
- 確保提供程序流中的重定向和操作URL保持在代理路徑中。我不認爲目前是可行的,但也許可以通過一種方式來設置代理內容的替代模式。
很好的答案卡爾,謝謝。我們得出了類似的結論,只是希望有一個更簡單的選擇。將這個開放一兩天,否則將接受這個答案。 – papercowboy