2016-12-28 85 views
0

我在JavaScript文件中有一個方法。Jasmine:測試函數,使用jasmine從不同的函數調用

function foo() { 
    setTimeout(function() { 
     bar.getSomeUrl(); 
     },WAIT_FOR_SOMETIME); 
} 

現在getSomeUrl()實現如下。

var bar = { 
    getSomeUrl : function(){ 
     window.location.href = 'someUrl'; 
     return; 
    }, 
    anotherProp : function() { 
     return bar.getSomeUrl(); 
    } 
}; 

我試圖測試,當我稱之爲foo()方法getSomeUrl()方法將被調用。

我正在使用茉莉花進行測試。我的茉莉花測試如下:

describe('This tests getSomeUrl()', function() { 
    it('is called when foo() is called', function(){ 
     spyOn(bar,'getSomeUrl').and.callFake(function(){}); 

     window.foo(); 
     expect(bar.getSomeUrl).toHaveBeenCalled(); 

    }); 
}); 

我真的不關心什麼測試的getSomeUrl()內部發生的,因爲我有一個單獨的測試。

我試圖測試的是,當我從某處調用我的foo()時,getSomeUrl()被調用。

我有以下問題:

  1. 如果我做這樣的測試失敗,並在運行所有測試結束後,將瀏覽器重定向到someUrl。我沒想到會發生這種情況,因爲我認爲自從我在bar.getSomeUrl()上有一名間諜,並且正在返回fake method,所以當我撥打window.foo()時,實際上並不會調用bar.getSomeUrl()
  2. 所以我想可能是我應該做的,如下:

    預期(window.foo).toHaveBeenCalled();

這沒有意義,因爲我試圖測試bar.getSomeUrl()被調用。

但是我這樣做的時候,測試失敗,我得到了以下錯誤:

Error: Expected a spy, but got Function.

我還以爲這可能是setTimeout功能,導致該問題,改變了foo()功能:

function foo() { 
    bar.getSomeUrl(); 
}; 

沒有任何改變

我一直與茉莉e和Javascript,現在只有幾天,並且對事情的工作有廣泛的理解。

任何建議,使這個測試通過,也是一個指針,我做錯了什麼是非常感謝。

+0

它不是java相關的。 JavaScript拼寫一個詞,並與Java沒有任何關係。 –

+0

照顧到了這一點。謝謝。 – ChillBan123

+0

你有一個語法錯誤。 'bar.getSomeUrl'是一個對象文字(語法無效)。這不是一個功能 – Phil

回答

0

首先,bar.getSomeUrl應該是一個函數,而不是一個(無效的)對象

var bar = { 
    getSomeUrl : function() { 
     window.location.href = 'someUrl'; 
     return; 
    }, 
    anotherProp : function() { 
     return bar.getSomeUrl(); 
    } 
}; 

其次,隨着超時測試代碼時所使用的Jasmine Clock

describe('This tests getSomeUrl()', function() { 
    beforeEach(function() { 
     jasmine.clock().install(); 
    }); 

    afterEach(function() { 
     jasmine.clock().uninstall(); 
    }); 

    it('is called when foo() is called', function(){ 
     spyOn(bar,'getSomeUrl').and.callFake(function(){}); 

     foo(); 
     expect(bar.getSomeUrl).not.toHaveBeenCalled(); 

     jasmine.clock().tick(WAIT_FOR_SOMETIME);  
     expect(bar.getSomeUrl).toHaveBeenCalled();  
    }); 
}); 
+0

謝謝。我已經實現了'bar.getSomeUrl'作爲一個函數。發佈問題時發生錯字。 – ChillBan123

+0

試過這個建議。沒有幫助。仍然最終重定向到'someUrl'。 – ChillBan123

+0

好吧,我在瀏覽器中調試測試運行器,發現我收到一個異常: '模擬時鐘未安裝.' 我做了一個項目重建並重試,似乎一切正常。謝謝@Phil。那麼由於setTimeout函數調用,測試失敗了嗎? – ChillBan123

相關問題