2013-10-17 69 views
2

通過一段JavaScript構建這樣的:JavaScript單元測試 - 用茉莉花來窺探自調用函數

var myClass = function(myArgumentObject) { 

    var vm = { 
     myFunction: myFunction, 
     myVariable: myVariable 
    } 
    return vm; 

    myFunction() { 
     myVariable = 1 + 1; 
     myArgumentObject.aMethod(); 
    } 

} (myArgumentObject); 

一個如何(如果有的話)可以使用茉莉花框架來窺探(即模擬出) myArgumentObject,以便可以單元測試myFunction?

這樣做:

it('test myFunction', function() { 
    myClass.myFunction(); 
    expect(myClass.myVariable).toEqual(2); 
}); 

失敗,因爲當它試圖呼籲myArgumentObject的方法有錯誤。我知道我可以使用jasmine.createSpy創建一個僞版本的myArgumentObject,但我看不到你是如何通過它的。

+0

該函數不應該返回'vm'嗎? –

+0

是的,它應該。剛剛錯過了構建僞代碼。現在補充,謝謝。 –

回答

0

因此,我假設以下內容,您有一個名爲myArgumentObject的函數aMethod。然後你可以使用這個茉莉花來窺探這個功能。

it('test myFunction', function() { 
    spyOn(myArgumentObject, 'aMethod') 
    myClass.myFunction(); 
    expect(myClass.myVariable).toEqual(2); 
}); 

但如果你不能測試這個沒有gloabl變量,因爲那樣undefined傳遞給測試,它總是會失敗,因爲你不能在函數的範圍改變私有變量。

+0

感謝您的建議。但myArgumentObject是myClass中的全局變量。但它不在測試課程中提供。因此,根據我是否使用該對象的命名空間,做上述建議導致「spyOn找不到要偵查的對象」或「無法找到變量myArgumentObject」錯誤。 –

1

偉大的問題!測試是關鍵。

您可以將測試中定義你的參數/輸入:

it ('test myClass function', function() { 
    myArgumentObject = function() { 
     this.aMethod: jasmine.createSpy(); 
    }; 
    // mock out initial values for your other variables here, eg myVariable 

    spyOn(vm, 'myFunction').andCallThrough(); 

    myClass(myArgumentObject) 

    expect(myArgumentObject.aMethod).toHaveBeenCalled() 
    expect(vm.myVariable).toEqual(2) 
}); 

幾件事情要記住 - 你的「返回VM」聲明將提前削減你的功能關閉 - 你將不再需要它。

您應該儘早定義變量,以免發生錯誤。考慮將myFunction移動到'vm'對象上方。