2015-08-13 38 views
2

我無法斷言在返回承諾後調用了我的過濾器。如何在服務中調用過濾器進行單元測試

這個代碼從一個控制器,其然後再換數據從HTTP GET服務過濾稱爲:

getPermissions(){ 
    return this.DataService.getPermissionsLOV().then((data) => { 
     return this.$filter('chunkCollection')(data, 3); 
    }); 
} 

我的測試用例看起來像這樣:

it('should get the permissions',() => { 
    spyOn(service, 'getPermissions').and.callThrough(); 
    spyOn(DataService, 'getPermissionsLOV').and.callFake(function(){ 
     var defer = this.$q.defer(); 
     defer.resolve(mockData); 
     return defer.promise; 
    }); 

    let resp; 

    service.getPermissions().then((data) => { 
     resp = data; 
    }); 

    scope.$digest(); 

    expect(service.getPermissions).toHaveBeenCalled(); 
    expect(DataService.getPermissionsLOV).toHaveBeenCalled(); 
    expect(resp).toEqual(mockData); 

}); 

斷言expect(resp).toEqual(mockData);未按響應過濾chunkCollection但我不知道如何測試這個電話$filter

我已經單獨測試過濾器本身,所以知道工作和業力告訴我,當報告上述斷言失敗時它正在轉換數據。

回答

5

我認爲你的問題是如何模擬一個過濾器。您可以添加一個beforeEach並在測試前提供過濾器。

var mockChunkCollectionFilter = jasmine.createSpy('chunkCollectionFilter'); 
beforeEach(module(function($provide) { 
    $provide.value('chunkCollectionFilter', mockChunkCollectionFilter); 
})); 

it('should get the permissions',() => { 
    spyOn(service, 'getPermissions').and.callThrough(); 
    spyOn(DataService, 'getPermissionsLOV').and.callFake(function(){ 
     var defer = this.$q.defer(); 
     defer.resolve(mockData); 
     return defer.promise; 
    }); 
    mockChunkCollectionFilter.and.callFake(function (data, chunks) { 
     // Ignore chunks since that's what the test expects. 
     return data; 
    }); 

    let resp; 

    service.getPermissions().then((data) => { 
     resp = data; 
    }); 

    scope.$digest(); 

    expect(service.getPermissions).toHaveBeenCalled(); 
    expect(mockChunkCollectionFilter).toHaveBeenCalled(); 
    expect(DataService.getPermissionsLOV).toHaveBeenCalled(); 
    expect(resp).toEqual(mockData); 

}); 

mockChunkCollectionFilter就像你的其他間諜一樣工作。

+0

我將如何將其整合到測試案例中?對不起,我對這件事很感興趣。 – RyanP13

+0

@ RyanP13當然,擴大我的答案。讓我知道如果有幫助 – Yunchi

+0

謝謝!我一直在尋找這樣的例子。我見過的少數幾個示例中的一個示例演示瞭如何模擬過濾器並在其中使用callFake,以便過濾器可以在不同情況下返回不同的值。 – jsparks

1

既然你知道模擬響應是什麼,你也知道過濾器是什麼,你知道如果過濾器工作正常,過濾器會返回多少行。您只需要聲明已解析的集合在過濾器完成後包含確切的項目和數量。如果過濾器正常工作,則這些數據將匹配。

+0

其實我完全錯了。分配給resp的數據返回爲未定義。 – RyanP13

+0

您可以在過濾器行中放置斷點並查看過濾器正在獲取的數據是什麼。 – Chandermani

相關問題