2016-04-15 93 views
0

我即將構建一個小部件,並且我想使用Jasmine來測試代碼,並且我想測試的一件事是changeHtml已被調用。以下是我計劃構建小部件的一個粗略示例。我將如何使用茉莉花測試此代碼?

var widget = function(userOptions){ 
    var options = userOptions 

    var init = function(){ 
    changeHtml(); 
    }; 

    var changeHtml = function(){ 
    document.getElementById(options.widgetId).innerHTML = 'New and exiting things!'; 
    }; 

    init(); 
}; 

var myWidget = new widget({widgetId: 'widget-div'}); 

現在,由於changeHtml()是私人(正確的短語?)的widget功能,我不能窺探它,看它是否已被稱爲與否。

我現在唯一能想到的就是讓所有東西都成爲widget的公共方法,但這看起來並不特別好,因爲用戶不需要/想要打電話給changeHtml()他們的自我。

這將是什麼解決方案?或者,我是否以錯誤的方式思考這個問題,最好是檢查一下div是否已經改變了,而不是被調用的函數?

+1

你的最後一句話總結一下。方法調用是一個實現細節。你想測試結果,它如何到達那裏並不重要。 –

回答

2

要麼1)測試已經暴露在函數/對象中的最終結果或2)spyOn函數。

要在場景測試最終結果,你需要或者檢查HTML值它改變後,或檢查,它被稱爲所以可以將該值設置,如下所示:

describe("widget", function() { 
    it("Should change html", function() { 
     // Arrange 
     spyOn(document, "getElementById").and.callThrough(); 

     // Act 
     var myWidget = new widget({ widgetId: 'widget-div' }); 

     // Assert 
     expect(document.getElementById).toHaveBeenCalled(); 
    }); 
}); 
+0

啊哈,我喜歡這個想法,謝謝:) –