2013-10-09 46 views
9

我想測試已使用sockjs實現的網絡套接字。如何對網絡套接字進行單元測試 - JavaScript

var sock = new SockJS('http://mydomain.com/my_prefix'); 
    sock.onopen = function() { 
     console.log('open'); 
    }; 
    sock.onmessage = function(e) { 
     console.log('message', e.data); 
    }; 
    sock.onclose = function() { 
     console.log('close'); 
    }; 

我戴着眼罩,只發現這個article。這還不夠好,因爲它正在進行實際連接而不是僞造它。

我也試過了但是隻找到一個懸而未決的問題here

有人建議sinonjs但我無法找到任何像樣的例子。

,我會很感激,如果有人能在這個話題提供一些線索。

回答

3

當你想單元測試一項功能,訪問外部資源,就像在你的情況下,WebSocket的服務器,通常的做法是使用模擬對象來表示外部資源。模擬對象是一種外觀和行爲像外部資源的對象,但實際上並沒有訪問它。另外,它可以具有日誌記錄功能,允許它向測試代碼報告測試代碼的行爲是否像預期的那樣。

在你的情況,你會創造出擁有所有相關屬性和正常SockJS的方法對象一個模擬SockJS對象,但其實施不實際接觸的服務器。它只記錄方法調用並返回現有服務器發送的預期響應。

然後你會重構你想測試的代碼,這樣它就不會創建套接字本身,而是獲得從外部分配的套接字對象(這被稱爲「dependency injection」,並且是編寫單元的關鍵習慣用法,可測試的代碼)。

在你真正的代碼,你分配一個真正的SockJS對象。但在你的單元測試中,你分配了你的模擬對象。在調用測試方法之後,可以檢查模擬對象以檢查單元是否將預期數據發送到服務器。

+2

感謝您的反饋,它看起來像很多工作。我正在尋找準備好的東西。例如,茉莉花已經有了創建假AJAX調用的所有工具。 Web套接字正變得越來越流行。是否有任何圖書館能夠將這些模擬對象從盒子中拿出來? –

+2

@ user2855314 Jasmin將實體對象作爲裝飾器實現模擬對象。它的術語是「間諜」。 'SpyOn'方法可以通過調用'andCallFake(function)'來實現,方法調用委託給你自己的實現。這可以防止對象實際嘗試聯繫服務器,而是返回實現返回的內容。 – Philipp

+1

@菲利普,你能提供這方面的例子嗎? –