单元测试使用$ filter('translate')的控制器函数

时间:2015-09-04 09:49:49

标签: angularjs jasmine

我有一个控制器函数,它返回一个与转换过滤器的返回值连接的字符串:

$scope.getDetails = function(history) {
  return angular.fromJson(history.value).name + $filter('translate')('CATALOGUE_HISTORY.ADD_ACTION');
};

我现在正在编写一个测试来检查函数是否返回了预期的字符串,并且到目前为止已将以下内容放在一起:

'use strict';
    describe('CatalogueHistoryController', function() {
      var $controller, $filter, $scope, controller, history;

      beforeEach(function() {
        module('app');
      });
      beforeEach(inject(function(_$controller_, _$filter_) {
        $controller = _$controller_;
        $filter = _$filter_;
      }));
      beforeEach(function() {
        $scope = {};
        $httpBackend.expectGET('assets/locale/en_gb.json').respond({})
        controller = $controller('CatalogueHistoryController', {
          $scope: $scope,
          $filter: $filter
        });
      });
      describe('$scope.getDetails', function() {
        beforeEach(function() {
          history = {
            value: "{\"id\":3,\"name\":\"Some Name\"}"
          };
        });
        it('should produce an add message', function() {
          expect($scope.getDetails(history)).toEqual('Some Name was added to the catalogue');
        });
      });
    });

当测试运行时,它失败并显示:

预期'Some NameCATALOGUE_HISTORY.ADD_ACTION'等于'某些名称已添加到目录'。

我是否需要以某种方式为特定的CATALOGUE_HISTORY.ADD_ACTION ID模拟翻译过滤器?

修改

我目前正在配置角度转换,如下所示:

angular.module('app').config(function($translateProvider) {
  $translateProvider.useStaticFilesLoader({
    prefix: 'assets/locale/',
    suffix: '.json'
  });
  $translateProvider.preferredLanguage('en_gb');
  $translateProvider.useSanitizeValueStrategy('sanitize');
});

1 个答案:

答案 0 :(得分:2)

我会嘲笑$filter并注入它的模拟版本。

您在此特定测试中的目标是测试您自己的功能,而不是测试过滤器。过滤器测试属于过滤器实现。

有很多方法可以模拟关于翻译过滤器本身的过滤器here's one

确保在测试中调用$filter('translate')('has been entered');后,只需返回您传递的字符串(例如'has been entered'),您的测试将非常简单:

  describe('$scope.getDetails', function() {
    beforeEach(function() {
      history = {
        value: "{\"id\":3,\"name\":\"Some Name\"}"
      };
    });
    it('should produce an add message', function() {
      expect($scope.getDetails(history)).toEqual('Some Name has been entered');
    });
  });