我有一个控制器函数,它返回一个与转换过滤器的返回值连接的字符串:
$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');
});
答案 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');
});
});