2015-10-22 118 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