2015-10-22 119 views
2

现状:

我测试的功能,允许用户选择一种语言。 但我收到以下错误:

TypeError: $translate.use is not a function 

我已经看到了SO和其他论坛类似的问题,但他们不是为我工作。

的代码:

的配置:

app.config(function($stateProvider, $urlRouterProvider, $translateProvider) { 

$translateProvider.useSanitizeValueStrategy('sanitize'); 

$translateProvider.translations('EN', { 

    "MY_ACCOUNT":     "My account", 
    "PROJECT_LIST":     "Project List", 
    "SETTINGS":      "Settings", 

}); 

$translateProvider.translations("IT", { 

    "MY_ACCOUNT":     "Mio account", 
    "PROJECT_LIST":     "Lista progetti", 
    "SETTINGS":      "Impostazioni", 

}); 

$translateProvider.preferredLanguage(window.localStorage['language'] || 'EN'); 

$translateProvider.fallbackLanguage("EN"); 

功能:

$scope.select_language = function(language) 
    { 
     window.localStorage['language_code'] = language.code; 

     $translate.use(language.code); 

     $rootScope.app_language = language.code; 
    } 

测试:

describe('App tests', function() { 

    beforeEach(module('my_app.controllers')); 

    beforeEach(inject(function(_$controller_, _$rootScope_) 
    { 
     $controller = _$controller_; 
     $rootScope = _$rootScope_; 
     $scope = _$rootScope_.$new(); 
     $translate = {}; 

     var controller = $controller('MainCtrl', { $scope: $scope, $rootScope: $rootScope, $translate: $translate }); 
    })); 

    describe('Language tests', function() 
    { 
     it('should properly load select_language function', function() 
     { 
      $scope.select_language({ name: "italiano", url: "img/italy.png", code: "IT"}); 
      expect($rootScope.app_language).toEqual("IT"); 
     }); 
    }); 

问题:

为什么我收到这个错误?

如何正确测试$ translate.use?

+0

瓦您是否注入'$ translate'?对我来说,它看起来像翻译是'{}'没有'.use'方法 – maurycy

+0

我怎样才能正确地注入它? – johnnyfittizio

+0

同样的方式你注入'$控制器'或'$ rootScope' – maurycy

回答

3

我假设$translate是不是你的方法,你不需要测试它,那么你可以用空操作方法

describe('App tests', function() { 

beforeEach(module('my_app.controllers')); 

beforeEach(inject(function(_$controller_, _$rootScope_) 
{ 
    $controller = _$controller_; 
    $rootScope = _$rootScope_; 
    $scope = _$rootScope_.$new(); 
    $translate = { 
     use: function(){} 
    }; 

    var controller = $controller('MainCtrl', { $scope: $scope, $rootScope: $rootScope, $translate: $translate }); 
})); 

describe('Language tests', function() 
{ 
    it('should properly load select_language function', function() 
    { 
     $scope.select_language({ name: "italiano", url: "img/italy.png", code: "IT"}); 
     expect($rootScope.app_language).toEqual("IT"); 
    }); 
}); 

返回一个对象,如果你需要签,如果它被称为与正确参数,你可以做

$translate = { 
    use: jasmine.createSpy('$translate.use') 
} 

,那么你可以把它添加到预期

expect($translate.use).toHaveBeenCalledWith(//language code) 
+0

非常感谢!我整个上午都在撞墙,以找到解决方案! – johnnyfittizio

+1

在那里,做到了,很高兴帮助:) – maurycy