2013-10-06 87 views
0

我搜索了該網站和一些文獻,無法得到明確的答案。我正在嘗試學習單元測試,同時構建一個新的網頁,這個網頁只是作爲一個白板,可以添加到它後面。單元測試相關測試

我有一個代表白板的Canvas對象和一個代表post-its的代表對象。我(現在)全局函數來獲取獨一無二的帆布,這是我測試這樣的:

this.testRetrieveCanvas = function() 
{ 
    var canvas = getCanvas(); 

    this.assertTrue(canvas != null); 
} 

this.testCanvasType = function() 
{ 
    var canvas = getCanvas(); 

    this.assertTrue(canvas instanceof Canvas);  
} 

this.testIfCanvasIsReused = function() 
{ 
    var canvas = getCanvas(); 

    this.assertEquals(canvas, getCanvas());  
} 

所以,我測試了三件事情:

  1. 是否該方法返回一個帆布?
  2. 它是一個殘酷的畫布嗎?
  3. 該方法總是給我一樣的畫布嗎?

到目前爲止沒有問題。但過了一會兒,我測試「並稱票到畫布」:

this.testAddTicketToCanvas = function() 
{ 
    var ticket = factory.createTicket("yellow"); 
    var canvas = getCanvas(); 

    canvas.addTicket(ticket);  

    this.assertTrue(canvas.contains(ticket)); 
}; 

正如你所看到的,我使用的是getCanvas我的測試()函數中。這是一個依賴性測試嗎?我的意思是,前三個測試必須通過,如果我想這個測試能夠毫無疑問地運行。如果它是依賴的,我將如何解決這個問題?

+0

沒有代碼的其餘部分,我不能幫忙,但你應該看看http://chaijs.com/api/bdd/(chai),http://sinonjs.org/(sinon)或http://gofreerange.com/mocha/docs/(mocha)介紹在JavaScript中進行嘲諷。 –

+0

我不確定你需要額外的代碼來回答我的問題。也許我會換個說法:我是否違反了單元測試規則,通過進行第四次單元測試,取決於前三個? – David

+0

@DavidMaes需要更多信息。你在使用什麼測試框架?即你是否編寫過「assertTrue」方法(如果可以的話你可以包括源代碼?)或者你是否從庫中使用它?你也可以請包括「getCanvas()」的代碼,因爲這也需要回答你的問題。 –

回答

0

嚴格來說,您應該重寫getCanvas()以返回預構造的(即未調用原構造函數)部分模擬畫布。這就是說,如果canvas的構造函數是一個空函數,並且getCanvas方法沒有涉及業務邏輯,那麼不應該有問題。

我會更加警惕最後兩條陳述一起使用。 canvas.addTicket(ticket);是可以的,因爲它是被測試的功能。但是你斷言你已經使用來自同一個對象的方法添加了票據。如果這個方法還沒有實現,或者返回錯誤,或者更糟的情況會怎麼樣呢?如果你的addTicket方法有副作用,可以使它添加到列表的票證,但改變一個標誌,使拋出一個異常,或返回false或true?如果包含某些業務邏輯會使其發送它的票證返回false,但在生產環境中對同一票證爲true(即,您的測試票證尚未正確初始化,缺少狀態,已被標記爲已排除來自環境的業務流程),如果現在沒有邏輯,但如果項目進入兩個月,邏輯會發生變化,以至於測試失敗,但其他所有工作都會發生(添加新狀態,並且沒有此狀態的對象被視爲不存在,客戶a,b和c除外)。我可以繼續。

我的觀點是沒有代碼,我們不能專門回答你的問題,只給你指針和一般答案像上面那樣。如果您真的不想發佈代碼,那麼請考慮所有這些情況以及您可以想到的所有其他情況,並且如果在這些情況下以這種方式測試代碼,則不會破壞代碼,也不會立即測試和測試在可預見的將來,那你就沒事了。

+0

我確實可以製作一個新的Canvas,而不是使用getCanvas方法。正如你注意到的,我正在尋找一個普遍的答案。我非常希望提供更多的代碼,但它擊敗了目的:)。 對於addTicket/contains方法,我已閱讀了許多關於此問題的文章。我無法測試addTicket方法,因爲保留所有票據的列表是私人的。我在這裏有幾個選擇,我認爲: - 我公開的門票(這對我來說不是一個好的設計決定,因爲畫布必須能夠跟蹤所有門票 - 我測試它作爲一個組合 感謝您的長時間回覆 – David

0

你的問題的簡短答案是,不。 只要你堅持這些rules如果你的代碼不違反任何單位測試 原則。

通常,有了這些問題,關於嘲笑某些測試的某些部分的討論很多,例如你的getCanvas()函數。我同意這個討論背後有理由,如果你想繼續進行測試或TDD,你應該深入探討這個話題。(請參閱Martin Fowler的優秀article)。

但是,對於這個問題,如果這是一個有效的單元測試,我認爲這是不相關的,只要你堅持單元測試規則。

+0

非常感謝您的回覆,我的確熱切希望能夠深入探討這個問題,但有一部分內容我不完全瞭解 1)測試/什麼不測試 2)異步功能(如加載文件並分派兩個事件(成功和失敗)的方法) 我將馬上介紹Martin Fowler的文章,謝謝。答案: – David

+0

s尿的東西。我很高興能夠提供幫助 –