2016-07-25 113 views
0

我正在使用socket.io IRC,我不希望用戶有長用戶名。我寫了下面(摩卡)測試,以驗證提供了較長的用戶名時,服務器不會發送到每一個連接插座的響應:如果服務器響應給出瞭如何失敗測試?

it("should not accept usernames longer than 15 chars", function (done) { 
    var username = "a".repeat(server.getMaxUsernameLength() + 1); 
    client1.emit("username change", username); 
    client2.on("chat message", function (data) { 
     throw Error("Fail, server did send a response."); 
    }); 
    setTimeout(function() { 
     done(); 
    }, 50); 
    }); 

這個目前的工作,但它最佳的遠。如果我的CI平臺速度較慢或者服務器在超過50 ms後做出響應會怎麼樣?在給出響應時,通過測試失敗的最佳方式是什麼?還是應該以不同的方式構建我的測試?

謝謝!

P.s.這個問題與Testing asynchronous function with mocha不同,因爲雖然問題確實與異步測試有關,但我知道done()方法(我明顯使用它)。

+0

所以你想在測試失敗的時候完全失敗? – Iceman

+1

[用mocha測試異步函數]可能的副本(http://stackoverflow.com/questions/12159846/testing-asynchronous-function-with-mocha) – rpadovani

+0

我想在服務器確認用戶名併發送它時測試失敗到所有連接的客戶端(「用戶X更名爲用戶Z」)。 –

回答

0

你要做的是驗證從未調用client2.on("chat message"...的回調。對負面情況進行測試可能很困難,而且您的情況似乎因爲您嘗試進行完整的端到端(客戶端到服務器到客戶端)集成測試而加劇。就我個人而言,我會嘗試在單位套件中進行測試,避免在測試中引入異步複雜性。

然而,如果一定要做,這裏是從Eradicating Non-Determinism in Tests小費:

這是最棘手的情況,因爲你可以測試你的預期反應,但沒有什麼可以做的檢測除了定時以外的故障退房手續。如果提供者是你正在構建的東西,你可以通過確保提供者實現某種方式來表明它已經完成 - 基本上是某種形式的回調。即使只有測試代碼使用它,也是值得的 - 儘管通常你會發現這種功能對於其他目的也很有價值。

您的服務器發送某種形式的通知,以client1,這是怎麼回事忽略名稱更改,即使你不是測試,而是因爲你是你可以使用這樣的通知,以確認它真的沒」不發送通知給其他客戶。所以像這樣:

it("should not accept usernames longer than 15 chars", function (done) { 
    var chatSpy = sinon.spy(); 
    client2.on("chat message", chatSpy); 
    client1.on('error', function(err) { 
    assertEquals(err.msg, 'Username too long'); 
    assert(chatSpy.neverCalledWith(...)); 
    done(); 
    }); 

    var username = "a".repeat(server.getMaxUsernameLength() + 1); 
    client1.emit("username change", username); 
}); 

將是合適的。

此外,如果由於某種原因,server.getMaxUsernameLength()有史以來開始返回除15以外的東西,最好的情況是您的測試描述變得錯誤。如果getMaxUsernameLength和用於處理名稱更改事件的服務器代碼沒有從同一位置獲取它們的值,則會變得更糟。測試可能不應該依賴被測系統來提供測試值。

相關問題