2013-07-02 160 views
2

我使用茉莉花節點來測試我的服務器。我想在我的用戶類中僞造/繞過一些與驗證相關的代碼。所以,我會成立這樣的間諜 -茉莉花異步功能間諜

var user = { 
    email: '[email protected]', 
    password: 'password' 
} 

spyOn(User, 'validateFields').andReturn(user); 

然而validateFields功能是異步...

User.prototype.validateFields = function(user, callback) { 

    // validate the user fields 

    callback(err, validatedUser); 
} 

所以,我居然會需要像這裏面的假貨,而不是一回回調 -

var user = { 
    email: '[email protected]', 
    password: 'password' 
} 

spyOn(User, 'validateFields').andCallback(null, user); 

茉莉花就是這樣的可能嗎?

回答

0

您可以傳遞迴調函數並詢問是否調用了此函數。

2

有兩種方法。首先,你可以窺視然後拿到args作爲間諜的第一個呼叫和呼叫thisfunction與模擬數據:

spyOn(User, 'validateFields') 
//run your code 
User.validateFields.mostRecentCall.args[1](errorMock, userMock) 

另一種方法是使用sinonJS stubs

sinon.stub(User, 'validateFields').callsArgWith(1, errorMock, userMock); 

這將立即調用帶模擬數據的回調函數。

0

對不起,4年的異步響應時間,但我只是想知道如何解決類似的問題,並找出我可以結合茉莉花done回調和and.callFake間諜方法。考慮下面的摘要示例:

describe('The delayed callback function', function(){ 

    it('should be asynchronously called',function(done){ 
    var mock = jasmine.createSpy('mock'); 
    mock.and.callFake(function(){ 
     expect(mock).toHaveBeenCalled(); 
     done(); 
    }); 
    delayed(mock); 
    }); 

}); 

function delayed(callback){ 
    setTimeout(function(){ 
    callback(); 
    },2000); 
}