2015-04-01 128 views
2

我是一個團隊的一員,已經在angularjs上工作了很長一段時間,我們的單元測試包含了包含測試邏輯和測試每個組件的提供者模擬的文件元素依賴於。如何避免AngularJS Jasmine測試中的代碼重複

這導致越來越多的代碼重複,任何人都可以推薦一種角度方法,我們可以維護測試基礎架構,模擬控制器或服務一次,並能夠根據需要將其模擬服務注入其他測試?

編輯我正在使用的代碼是專有的,但例如,考慮您有10或15個服務通過HTTP請求檢索數據,以不同方式格式化數據並返回該數據。一個例子可以返回數據數組所以依賴於該服務的每個文件,我們必須初始化這樣(減少和改變,所以請忽略任何拼寫錯誤或其他錯誤)

myDataService: { 
    getDataParsedLikeY: { 
     [{obj1},{obj2}...] 
    }, 
    getDataParsedLikeX: { 
     [{obja},{objb}...] 
    } 
beforeEach(angular.mock.module('myModule')); 
beforeEach(angular.mock.inject(function(myDataService) { 
    myDataService = function(functionName) { 
     return myDataService[functionName]; 
    } 
    spyOn(myDataService).and.callThrough(); 
}) 
} 
+0

你能否給我們一些不應該重複測試的示例代碼? – yazaki 2015-04-01 07:15:34

+0

我已經添加了我可以編輯的內容,希望它有幫助 – SMC 2015-04-01 07:33:24

+0

@yazaki服務嘲諷是他試圖不在每個控制器測試中重複遍歷的代碼。 – Stephane 2015-04-12 12:27:27

回答

0

如果你茉莉版本代碼2.x,你可以編寫像下面這樣的測試代碼,而不需要編寫模擬服務

spyOn(YourService, 'somemethod').and.returnValue('mock value'); 

在茉莉花1.3中,你需要調整一點點。

spyOn(YourService, 'somemethod').andReturn('mock value'); 

我希望這可以幫助你。

+0

謝謝你的回答,不幸的是我正在尋找一種方法,無需在服務使用的每個地方聲明這個間諜,因爲這些數據集可能非常大 – SMC 2015-04-01 08:25:25

+0

此外,我瞭解間諜無法處理服務有多個回調,比如有一個成功的回調和一個失敗的回調。這使得間諜對於簡單的服務很有用,但是對於更復雜的服務則需要適當的模擬。 – Stephane 2015-04-12 12:25:57

1

如果你正在尋找一種方法,不要在每個測試文件中聲明相同的模擬代碼,我會建議像下面這樣的東西,雖然我不確定這是否是角度方式。

[1]編寫代碼來聲明你的模擬服務,如下面只對角mocks.js

在你的普通mocks.js後,單元測試和進口爲你喜歡的(你可以將文件命名爲)

(function(window){ 
    window.mymock = {}; 
    window.mymock.prepare_mocks = function(){ 
     module(function($provide) { 
      $provide.service('myDataService', function(){ 
       this.getDataParsedLikeY = function(){ 
        return 'your mock value'; 
       }; 
      }); 
     }); 
    }; 
})(window); 

如果使用karma,則可以這樣寫入,以便將文件導入到karma.conf.js中。

files: [ 
    ... 
    '(somedirctory)/angular-mocks.js', 
    '(somedirctory)/your-common-mocks.js' 
    ... 
] 

[2]在測試文件中使用mymock.prepare_mocks函數。

describe('Some Test', function() { 

    beforeEach(mymock.prepare_mocks); 

    it('getDataParsedLikeY', inject(function(myDataService){ 
     expect('your mock value', myDataService.getDataParsedLikeY()); 

由於上述的結果,你必須寫代碼,模仿只是一次並在每個測試文件共享模擬代碼。我希望這可以建議你實現你想要的東西。