javascript - 如何对服务中调用的过滤器进行单元测试

标签 javascript angularjs filter jasmine spy

我无法断言在返回 promise 后调用了我的过滤器。

此代码从 Controller 调用,然后 Controller 从 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 过滤,但我不知道如何测试对 $过滤器?

我已经单独测试了过滤器本身,所以知道它正在工作,并且 karma 告诉我它在报告上述断言失败时正在转换数据。

最佳答案

我认为您的问题实际上是如何模拟过滤器。您可以只添加一个 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 就像您的其他 spy 一样工作。

关于javascript - 如何对服务中调用的过滤器进行单元测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31979169/

相关文章:

javascript - 从远程 url 获取 Backbone 集合错误

javascript - 如何在投票时继续解决 Q promise

javascript - 当 AngularJS 中 ng-checked = true 时,在页面加载时调用函数

javascript - AngularJS:为什么 .then() 不等待 promise 对象到达

javascript - 如何从执行 Stripe Integration 的 Controller 中获取 DOM 元素?

python - 根据列值删除 Pandas 中的 DataFrame 行 - 要删除的多个值

javascript - 给定季度数和年份,如何找到日期范围?

javascript - 如何根据其子节点删除父节点和/或 css 样式

filter - 如何在 playframework 中应用全局过滤器

Python:过滤元组