2011-12-06 76 views
2

我在我的Node.js應用程序中有一個JS方法,我想單元測試。它會對服務方法進行多次調用,每次都會將該服務傳遞給一個回調函數;回調積累結果。使用Jasmine根據參數值存根JS回調

如何使用Jasmine來存儲服務方法,以便每次調用存根時,都會調用由參數確定的響應的回調函數?

這是(像)的方法,我測試:

function methodUnderTest() { 

    var result = []; 
    var f = function(response) {result.push(response)}; 

    service_method(arg1, arg2, f); 

    service_method(other1, other2, f); 

    // Do something with the results... 
} 

我想指定,當service_method調用與ARG1和ARG2,存根將調用與特定響應的F回調,並當用other1和other2調用它時,它將調用具有不同特定響應的相同回調。

我會考慮一個不同的框架。 (我嘗試過Nodeunit,但沒有得到它做我想做的。)

回答

0

你不能存根,因爲它是私有的方法的內部。

您在這裏測試錯誤的東西。應通過確保結果得到妥善處理來測試methodUnderTest。確保service_method執行具有特定參數的回調是另一個測試,應該獨立進行測試。

現在methodUnderTest的規範可以簡單地說明在回調之後會發生什麼。如果回調工作,請不要擔心,因爲您已經在其他地方測試過了。只要擔心該方法對回調的結果有什麼作用。

即使service_method來自您不直接控制的庫或商品代碼,這仍然適用。經驗法則是測試您自己編寫的代碼,並相信其他庫遵循相同的規則。

0

由於我不確定你在這裏測試的是正確的東西,你可以使用spy並調用spy.argsForCall。

var Service = function() { 
}; 

Service.service_method = function (callback) { 
    someAsyncCall(callback); 
}; 

function methodUnderTest() { 

    var result = []; 
    var f = function(response) {result.push(response)}; 

    Service.service_method(arg1, arg2, f); 

    Service.service_method(other1, other2, f); 

} 
在測試

it('should test something', function() { 
    spyOn(Service, 'service_method'); 
    methodUnderTest() 
    var arg1 = Service.argsForCall[0][0]; 
    var arg2 = Service.argsForCall[0][1]; 
    var f = Service.argsForCall[0][2]; 
    if(arg1==condition1 && arg2==condition2){f(response1)} 

}); 
+0

這裏的兩個答案曲解了我的問題;我想知道爲什麼。我真的在測試methodUnderTest();我想驗證一下,在調用其依賴關係之後(在本例中爲service_method()),它會累積結果。 – Ladlestein

+0

好吧,據我所知你想在這裏測試內部方法?但爲什麼你想嘲笑service_method()。這不是你模塊的一部分嗎?如果是這樣,不要嘲笑它。 –

+0

不,Andreas - 當然,我想測試methodUnderTest()。它依賴於service_method(),它不是返回一個值而是調用一個回調函數。 service_method()是我想要的存根。它會回覆給f()和響應;我想要我的模擬service_method()回調它。 我已經成功地使用了Sinon.JS來存根service_method(),並調用帶有stubbed「return」值的回調函數。 – Ladlestein

9

您應該能夠使用callFake間諜戰略。在茉莉2.0,這將是這樣的:

describe('methodUnderTest', function() { 
    it("collects results from service_method", function() { 
    window.service_method = jasmine.createSpy('service_method').and.callFake(function(argument1, argument2, callback) { 
     callback([argument1, argument2]); 
    }); 

    arg1 = 1, arg2 = 'hi', other1 = 2, other2 = 'bye'; 
    expect(methodUnderTest()).toEqual([[1, 'hi'], [2, 'bye']]); 
    }); 
}); 

methodUnderTest返回結果數組。