2015-08-13 2 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