简体   繁体   中英

must return a value from $get factory method

I am trying to test an Angular service which I know works functionally as its been in place for a while. I've just come to retro fit some tests around it now but I am getting some strange issue where I get a message "must return a value from $get factory method" from the jasmine test.

The service does work in the website and the service returns an API

 var service = {
        setStartLanguage: setStartLanguage,
        setLanguage: setLanguage,
        supportedLanguages: supportedLanguages,
        currentLanguage: etCurrentLanguage.currentLanguage,
        getLanguage: getLanguage
    };

    return service;

I believe this is enough to get it working but I can't figure out why the test is complaining about it not returning a $get.

Oh and all I'm doing for the test is trying to expect that the service is defined.

EDIT: Full service code,

(function () {
'use strict';

angular.module('app.core').factory('etLanguageService', ['$translate', '$route', 'etCurrentLanguage', 'supportedLanguages', 'localStorageService', etLanguageService]);

function etLanguageService($translate, $route, etCurrentLanguage, supportedLanguages, localStorageService) {

    function setLanugageFromLocalStorage(storedLanguage) {
         etCurrentLanguage.currentLanguage = storedLanguage;
        $translate.preferredLanguage(etCurrentLanguage.currentLanguage.code);
        localStorageService.set('currentLanguage', etCurrentLanguage.currentLanguage);
    }

    function setLanguageFromBrowser() {
        var language = etCurrentLanguage.get();

        if (!language) {
            language = '';
        }

        var cleanLanguage = language.substr(0, 2).toLowerCase();


        var supportedLanguage = _.find(supportedLanguages, function(language) {
            return language.code === cleanLanguage;
        });

        $translate.preferredLanguage(supportedLanguage.code);
        localStorageService.set('currentLanguage', supportedLanguage);
    }

    function setStartLanguage() {

       // first check if we have a stored language
       var storedLanguage = localStorageService.get('currentLanguage');

       if (storedLanguage) {
           setLanugageFromLocalStorage(storedLanguage);
       } else {
           setLanguageFromBrowser();
       }

    }

    function setLanguage(language) {
        if (etCurrentLanguage.currentLanguage !== language) {
            etCurrentLanguage.currentLanguage = language;
            $translate.use(etCurrentLanguage.currentLanguage.code).then(function () {
                localStorageService.set('currentLanguage', etCurrentLanguage.currentLanguage);

                $route.reload();
            });
        }
    }

    function getLanguage() {
        return localStorageService.get('currentLanguage');
    }

    var service = {
        setStartLanguage: setStartLanguage,
        setLanguage: setLanguage,
        supportedLanguages: supportedLanguages,
        currentLanguage: etCurrentLanguage.currentLanguage,
        getLanguage: getLanguage
};

    return service;
}

}());

That's hard to tell without more test code.

$get is the method from the provider of your service. For each service, there is a provider which is responsible of creating an instance of your service through the $get method. If you have a service called myService , then there is a provider myServiceProvider . Internaly, when bootstraping your app, Angular calls mysServiceProvider.$get to get an instance of your service.

If you're tinkering with providers and mocks of providers, that could be a reason...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM