单元测试角度过滤器依赖于服务

时间:2016-01-21 17:03:25

标签: javascript angularjs unit-testing jasmine

我正在尝试测试我构建的自定义过滤器。我遇到的问题是这个过滤器依赖于通过服务的异步调用。下面是我的相关过滤器代码,然后是我当前的测试:

.filter('formatValue', ['serverService', '_', function(serverService, _) {
  var available = null;
  var serviceInvoked = false;

  function formatValue(value, code) {
    var details = _.findWhere(available, {code: code});
    if (details) {
      return details.unitSymbol + parts.join('.');
    } else {
      return value;
    }
  }

  getAvailable.$stateful = true;
  function getAvailable(value, code) {
    if (available === null) {
      if (!serviceInvoked) {
        serviceInvoked = true;
        serverService.getAvailable().$promise.then(function(data) {
          available = data;
        });
      }
    } else {
      return formatValue(value, code);
    }
  }
  return getAvailable;
}])

试验:

describe('filters', function() {

  beforeEach(function() {
    module('underscore');
    module('gameApp.filters');
  });

  beforeEach(module(function($provide) {
    $provide.factory('serverService', function() {
      var getAvailable = function() {
        return {
          // mock object here
        };
      };
      return {
        getAvailable: getAvailable
      };
    });
  }));

  describe('formatValue', function() {

    it('should format values', inject(function(formatValueFilter) {
      expect(formatValueFilter(1000, 'ABC')).toEqual('å1000');
    }));
  });
});

我在运行测试时遇到的错误是:

TypeError: 'undefined' is not an object (evaluating 'serverService.getAvailable().$promise.then')

1 个答案:

答案 0 :(得分:0)

您的模拟服务需要返回已解决的承诺。您可以通过注入$ q并返回$q.when(data)

来完成此操作

但是,我会先考虑重构这个过滤器。过滤器旨在快速计算,并且可能不应依赖于异步调用。我建议将你的http调用移动到控制器,然后传递过滤器所需的数据。