1

我有一个服务,$language它在应用程序配置中被调用(所以在每个 Spec 运行之前)。调用的方法,$language.update(),触发器$translate.use()(进而触发$http.get())。这会导致Unexpected request: GET /<lang>/i18n.

我尝试了一些不同的方法来解决这个问题,但每一个似乎都会导致一个新问题:

全局模拟$translate服务

// not inside a describe()
beforeEach(function() {
    module(function($provide) {
        $provide.value('$translate', {
            get:         function() { return false; },
            storage:     function() { return false; },
            storageKey:  function() {
                return {
                    get: function() { return false; },
                    set: function() { return false; }
                };
            },
            use:         function() { return false; }
        });
    });
});

但是有些东西试图调用$translate(),所以我尝试使模拟成为返回对象的函数,但这也不起作用。

通过 $httpBackend 模拟 GET 请求

// not inside a describe()
beforeEach(function() {
     // this already existed to avoid another problem caused by $translate
    module('MyApp', function config($translateProvider, $anotherProvider) {
        // …
    });

    // new
    inject(function($httpBackend) {
        $httpBackend.when('GET', '/<lang>/i18n').respond({});
    });
});

但随后它抱怨Injector already created, can not register a module!模块注入的顺序似乎并不重要)。

我曾想过在全球范围内模拟我的 $language 服务,但是我无法在它自己的 Spec 中对其进行测试。

理想情况下,我更喜欢全局模拟 $translate ,因为它似乎会导致一个又一个问题。

4

1 回答 1

2

问题是这$translate是一个提供者;因此提供者需要 $provide'd:

// Outside of a describe so it's treated as global
beforeEach(function() {
    module('MyModule', function config($providerA, $provide) {
        // …
        $provide.provider('$translate', function() {
            var store                 = {};
            this.get                  = function() { return false; };
            this.preferredLanguage    = function() { return false; };
            this.storage              = function() { return false; };
            this.translations         = function() { return {}; };

            this.$get = ['$q', function($q) {
                var $translate        = function(key) {
                    var deferred = $q.defer(); deferred.resolve(key); return deferred.promise;
                };

                $translate.addPair    = function(key, val) { store[key] = val; };
                $translate.isPostCompilingEnabled = function() { return false; };
                $translate.preferredLanguage = function() { return false; };
                $translate.storage    = function() { return false; };
                $translate.storageKey = function() { return true; };
                $translate.use        = function() { return false; };

                return $translate;
            }];
        });
    });
});
于 2014-10-06T18:59:52.300 回答