2015-09-10 30 views
0

我有一個BackboneView我在創建如何測試在其構造函數中調用集合的視圖的視圖?

var my_collection = new Collection(); 
    new MyView({temp: template, collection: my_collection }); 

傳遞一個集合的觀點裏面,取()方法被調用集合中的構造類似這樣的

export class MyView extends Backbone.View { 

    constructor(options){ 

     this.collection = options.collection; 
     super(); 
     this.collection.fetch().done(function(resp){ 
     that.render(); 
     }) 
    } 
    render(){ 
    } 

} 

我(過去緊張)的一系列測試的視圖的UI /模板這樣

describe('testing my view', function() { 
    it('should have one main child - div 6 ', function() { 
     expect(myview.el.children.length).to.equal(1); 
    }); 
    }); 

然而,因爲我現在已經補充說,通過收集到的代碼測試該視圖,並在構造函數集合上調用fetch方法,我的所有測試都失敗了,因爲每次運行測試時,視圖都會嘗試調用fetch方法。即使我通過存根收藏,我必須設置一個url和視圖將嘗試在存根集合導致404

var gs = class StubCollection extends Backbone.Collection{ 

    constructor(options){ 
    this.url = '/blah'; 
    } 
} 

    const drv = new MyView({temp: template, collection: new gs()}); 

我需要調用獲取在視圖中收集獲取(即我不能使用該代碼)。在這種情況下如何繼續測試視圖?

回答

2

您可以存根fetch方法本身。內部StubCollection它定義爲:

function fetch() { 
    return $.Deferred().resolve().promise(); 
} 

按照Backbone's documentationfetch返回jqXHR其表示被髮送的請求。

jqXHR是Promise,它是一個代表正在進行的過程的對象,它可以成功或失敗,並且分別具有稱爲donefail的方法用於註冊成功或失敗時調用的回調。 (如果請求成功,jqXHR成功,失敗則無法發送或服務器返回錯誤代碼)。

在上面的代碼中,我們手動創建了一個Deferred object(用於創建承諾),並立即將其狀態更改爲成功(使用resolve)。然後我們回覆它的承諾。因爲承諾立即被認爲是成功的,所以將立即調用done回調。

+0

非常感謝。你可以更新你的答案或添加評論,包括一個例子如何模擬'骨幹。保存()'以類似的方式(我遇到了類似的問題) – Leahcim

+0

@Leahcim您可以存根模型的'sync'方法(提出請求),以模擬服務器返回改變屬性的哈希:'函數同步(方法,模型,期權){$返回.Deferred()解決(options.attrs || model.toJSON(選項))的承諾()。 }' – Spike

2

不是最簡單的解決方案,但從長遠來看絕對是最好的: 您不應該在視圖集合上調用fetch

一個觀點確實沒有告訴集合或模型做什麼業務。視圖僅顯示數據和/或捕獲用戶輸入。加載所述數據的呼叫應該在別的地方。取決於你想要遵循的範例,可以在控制器或命令中。 這將使測試變得更加容易,因爲您的視圖會更加系統無關,即他們對何時發生的事情知之甚少。視圖,模型,集合和服務應該儘可能地愚蠢:測試,重用,擴展和修改更容易。 所有特定於應用程序的代碼都應該放入您的控制器和命令中。即它們是將應用程序不可知的視圖,模型和服務組合到您工作的特定應用程序中的粘合劑。

相關問題