2016-02-22 20 views
1

這是我的代碼:如何間諜在Jasper內部創建的函數beforeEach代碼塊?

describe('Factory: BaseService', function() { 
    var fctry, mockBackend; 

    beforeEach(function() { 

     module('BaseApp'); 

     cb = function() {}; 

     inject(function(_BaseService_, _$httpBackend_) { 
      mockBackend = _$httpBackend_; 
      BaseService = _BaseService_; 
     }); 
    }); 

    it('logout() should POST to /logout', function() { 
     spyOn(BaseService, 'accessErrors').and.callThrough(); 
     spyOn('cb'); 
     mockBackend.expectPOST("/logout").respond(404, {msg: 'Not Found'}); 

     BaseService.logout(cb); 

     mockBackend.flush(); 

     expect(BaseService.accessErrors).toHaveBeenCalled(); 
     expect(BaseService.cerrorMessages).toEqual(['Not Found']); 
     expect(cb).toHaveBeenCalled(); 
    }); 
}); 

當我運行這個測試,我得到它說的錯誤:

Chromium 48.0.2564 (Ubuntu 0.0.0) Factory: BaseService logout() should POST to /logout FAILED 
    Error: No method name supplied 

和它指向的線spyOn('cb')。監視beforeEach代碼塊中創建的函數的正確方法是什麼?

回答

1

通常,spyOn應該被用來去除依賴 - 對我來說,窺探一個在測試本身定義的函數似乎很奇怪。

在這種情況下,我可能只是建立一個間諜,並將其直接傳遞給BaseService.logout

it('logout() should POST to /logout', function() { 
    spyOn(BaseService, 'accessErrors').and.callThrough(); 

    // just create the spy here -- no need to create a function so you can replace 
    // it with a spy via spyOn :-). 
    var cb = jasmine.createSpy('cb'); 

    mockBackend.expectPOST("/logout").respond(404, {msg: 'Not Found'}); 

    BaseService.logout(cb); 

    mockBackend.flush(); 

    expect(BaseService.accessErrors).toHaveBeenCalled(); 
    expect(BaseService.cerrorMessages).toEqual(['Not Found']); 
    expect(cb).toHaveBeenCalled(); 
}); 
+0

感謝。快速問題,你究竟是什麼意思,「通常,spyOn應該用來消除依賴」?是不是間諜用來窺探對象,看它們是否被調用,以及它們被調用的內容? – user2719875

+1

你所描述的是_spy_的功能。 'spyOn'具有依賴性(例如附加到控制器或服務的功能或...),並在測試期間用間諜替換它。注意區別?在這種情況下,你不需要依賴窺探 - 你只需要一個跟蹤調用的對象(一個間諜)。 – mgilson

1

只能窺探的對象,這就是爲什麼spyOn語法是:

objFoo = {}; 
objFoo.funcBar = function() {}; 

spyOn(objFoo, 'funcBar'); 

因此創建一個對象來包含你的函數。

或者對窗口間諜,看到你發CB一個全局變量:

spyOn(window, 'cb'); 

儘管這不是真的建議:-)

相關問題