2012-03-02 23 views
5

如果您想直接跳到了的jsfiddle碼,它在這裏:http://jsfiddle.net/bbkxK/2/我應該能夠覆蓋實例中類級別指定的綁定嗎?

理想的情況下,我希望這兩個對象實例爲theMessage輸出「別的東西」。

這裏的背景: 我們有大量的灰燼應用程序,我們希望通過我們的類定義指定適當的默認綁定到全局單(如果要熄滅的切線使用約定優於配置方法並認爲這太可怕了,還有一種更好的方法,我全神貫注,我不喜歡我們當前的架構,但它遵循Ember開發者通過示例應用程序設定的模式)。

因此,我們指定在正在運行的應用程序中「正常工作」的默認綁定。到目前爲止,一切都很好。問題是我們何時開始單元測試。一旦我們碰到大約500個單元測試,我們就開始遇到測試隔離問題。一些測試會更新單身控制器的狀態,然後其他測試將開始失敗。它變成了一個巨大的混亂,時間在過去幾周下沉。

要隔離測試,我們開始嘗試覆蓋在我們的單元測試中創建的測試主題實例中在類級別指定的默認綁定。通常,我們會嘗試用對靜態對象的靜態引用替換綁定到單例。和我一起到目前爲止?

在嘗試了許多不同的方法後,到目前爲止我所提出的最佳策略是您可以在jsFiddle示例(http://jsfiddle.net/bbkxK/2/)中看到的MyApp.classWithDeferredDefaultBindings模式。

但是......它比普通的Ember做事要冗長得多,而且感覺不對。我想我們可以創建一個混合或猴子補丁Ember來使它更好,但在我們採取這一步之前,似乎是與開發者聯繫的好時機。

所以我的多重問題是:我們的方法是否合理,在單元測試的上下文中覆蓋默認單例綁定?我們是否應該向Ember發出功能請求以更加無縫地支持這一功能?你可以爭辯說它實際上是一個框架中的錯誤?

回答

5

首先,我只想介紹一下,我們真的需要編寫更多關於如何使用Ember測試的內容。

我認爲這是一個很好的規則說,綁定到絕對路徑裏面的類定義(依靠單例)是一個很大的禁忌。儘管使用相對綁定路徑是很好的。

我會建議你避免使用單身人士。這使得測試更加困難。通常的做法是,您應該始終將您的控制器定義爲類。然後你可以在你的應用程序和你的測試中實例化它們。比在你的測試中處理單例使用更容易,更不容易出錯。

+1

很難在簡單的jsFiddle中捕捉到我的問題。我們試圖在測試中不使用單例,但是我們無法覆蓋默認綁定。我想這是分裂的頭髮,你說不要設置默認綁定。我大多數人都同意,但是我們有500多個類(代碼庫大約有100,000行),並且在初始化過程中連接所有內容變得棘手。我們真正想要的是某種單身人士所在的依賴禁忌系統,如果在單元測試中不重寫,自動綁定。這就是我們試圖用這種綁定模式實現的。 – 2012-03-02 18:39:16

+1

我還應該添加嵌套視圖,我不希望父視圖需要知道控制器和其子視圖中的其他類似單實體的所有依賴關係,並且必須在實例化視圖時設置所有這些實例。這通常是高度動態的)。所以我們在我們的視圖中使用了controllerBinding:'...',這是我們編寫穩定的,孤立的測試時遇到的主要問題。但是,當我試圖解釋所有這些,我越來越確定我們不應該在這裏使用綁定。這肯定是不必要的性能打擊。回到畫板上,我想。 – 2012-03-02 19:03:29

+0

這裏的原始問題基本上是無效的。我們有架構缺陷,我們應該停止在類級別指定全局名稱空間的綁定。 – 2012-03-03 01:47:27