2016-08-01 57 views
0

我有以下簡單的工廠,我想寫一個單元測試。Jasmine和AngularJS - 當函數被用作依賴時如何測試工廠函數

(function() { 
    "use strict"; 

    angular 
     .module("math") 
     .factory("addservice", [addTwoNumbers]); 

    function addTwoNumbers(a, b) { 
     return a + b; 
    } 
    return { add: addTwoNumbers }; 
})(); 

這是我迄今在我的測試規範。

describe('adding two numbers', function() { 
    var addService; 

    beforeEach(function() { 
     module('math'); 
     inject(function ($injector) { 
      addService = $injector.get('addservice'); 
     }); 
    }); 
    it('should add two numbers and get 2', function() { 
     var result = addService.add(1, 1); 
     expect(result).toBe(2); 
    }); 
}); 

當試圖運行這個單元測試我得到TypeError:addService.add不是一個函數。我會注意到,如果我將工廠聲明更改爲下面的代碼,我可以得到這個工作,但是我們遇到了一個問題,那就是縮小了參數名稱並將其更改爲a,b,c等。 (當傳遞$ q,$ http和許多其他依賴項時)並破壞代碼,所以我們轉向了上面所看到的。這顯然是一個非常基本的例子,這就是爲什麼我無法得到這個工作是如此令人沮喪。

(function() { 
    "use strict"; 

    angular 
     .module("math") 
     .factory('addservice', [function() { 
     function addTwoNumbers(a, b) { 
      return a + b; 
     } 
     return { add: addTwoNumbers }; 
    } 
     ]); 
})(); 

看來我需要引用addTwoNumbers函數,但不知道該怎麼去做。我可能錯過了一些非常明顯的東西,所以不勝感激。

回答

0

好吧,我想通了這個例子有什麼問題。它結束了,如果我重構我的工廠有點我可以簡單地打個電話在我的單元測試屬性twoNumbersAddedTogether後,我得到了工廠本身的參考。我在下面提供了新的單元測試和工廠代碼。

工廠代碼

(function() { 
    "use strict"; 

    angular 
    .module("math") 
    .factory("addservice", [addTwoNumbers]); 

    function addTwoNumbers() { 

     return {twoNumbersAddedTogether: dotheMath} 

     function dotheMath(a,b) { 
      return a + b; 
     } 
    } 
})(); 

單元測試代碼

describe('adding two numbers', function() { 
var addService; 

beforeEach(function() { 
    module('math'); 
}); 

beforeEach(inject(function (_addservice_) { 
    addService = _addservice_; 

})); 

it('should add two numbers', function() { 
    var result = addService.twoNumbersAddedTogether(1, 1); 
    expect(result).toBe(2); 
});});