2012-01-11 68 views
4

單元測試新手,尤其是Jasmine。使用Jasmine進行單元測試:beforeEach()中的代碼未在測試的spyOn中看到()

我在beforeEach()回調中設置了一個變量,但它在第二個測試中似乎不起作用。它應該在之前每隔進行初始化測試,對吧?我確定我的電話是spyOn(),但我不知道如何解決。

評論解釋通行證和失敗:

describe("Test suite for my library", function() { 
    var html, 
     body, 
     play, 
... 

    // custom matcher... 
    beforeEach(function() { 
    this.addMatchers({ 
     toBeInstanceOf : function (constructr) { 
     return this.actual instanceof constructr; 
     }); 
    }); 
    }); 

    describe("Within the Button object", function() { 

    beforeEach(function() { 
     play = new Button("play", false); 
    }); 

    describe("play", function() { 

     // This test passes, as expected... 
     it("should be an instance of the Button object", function() { 
     expect(play).toBeInstanceOf(Button); 
     }); 

    }); 

    describe("play.name", function() { 

     // This test failed with the message 
     // "Expected spy Button to have been called 
     // with [ 'play', false ] but it was never called." 
     it("should be the first argument passed to the Button constructor", function() { 
     spyOn(window, "Button"); 
     play = new Button("play", false); // ...until I added this line. Now it passes. 
     expect(window.Button).toHaveBeenCalledWith("play", false); 
     }); 

     // This test passes, even if the one above fails. 
     it("should be 'play'", function() { 
     expect(play.name).toBe("play"); 
     }); 

    }); 

    }); 
}); 

documentation解釋用法,而不是背景下,spyOn(),所以我不能,如果我已經創建了一個錯誤或者說,如果我不知不覺中利用了一個功能。

如果有人認爲它在診斷中有任何區別,我可以發佈構造函數,但我可以向你保證它已經很簡單。

我敢肯定,這是一個簡單的修復,使用一些基本的單元測試概念,我不得不努力學習。提前致謝。

P.S.我意識到我正在測試的失敗規範不是我所描述的。我正在通過API指南工作,尋找一種方法來獲取函數調用中的參數數組,因此我可以在arguments[0]上進行特定的測試。提示是讚賞,但不是必要的。我會弄清楚。

回答

6

簡短的回答:沒有,之前每個和間諜並不矛盾

打電話之前,如果你想間諜知道關於呼叫你必須間諜。如果你不想幹擾它的默認行爲,你可以使用spyOn(object,'function')和andCallThrough()。

長答案:僞造/嘲諷/存根/間諜框架經常工作的方式是用嘲笑框架可以控制的方法替換您調用的方法。在被間諜替換前,任何對該功能的調用都不能被觀察到。這是一件好事,儘管稍微不方便,

+0

切換順序和CallThrough()做到了。 +1並被接受。非常感謝。 – parisminton 2012-01-21 01:39:46

+0

@parisminton。我在jamsine測試用例上發佈了一個問題。 http://stackoverflow.com/questions/26583283/jasmine-junit-testing-of-delegate-callback-of-function-args ..真正appriciate如果你能幫助。問候 – 2014-10-28 13:58:18

4

它的原因是你調用後在window.Button上偵聽。我不完全確定間諜是做什麼的,但畢竟它取代了你用另一個函數來監視的函數,它可以檢查被調用的函數以及傳遞了什麼參數。在開始測試之前創建Button時,調用原始的window.button函數。然後你用間諜替換這個功能並測試間諜被調用,所以你的測試必須失敗。

似乎要麼在測試本身中創建您的按鈕,要麼在您調用beforeEach函數中的新按鈕之前創建您的間諜。

+0

+1。事實上,我將'spyOn()'調用移到'beforeEach()'函數中,它的工作原理與您的建議完全相同。謝謝。 – parisminton 2012-01-21 01:44:38

相關問題