【问题标题】:Jasmine + AngularJS: Global services causes Unexpected GET requestJasmine + AngularJS:全局服务导致意外的 GET 请求
【发布时间】:2014-10-05 19:13:05
【问题描述】:

我有一个服务,$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!moduleinject 的顺序似乎并不重要)。

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

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

【问题讨论】:

    标签: angularjs unit-testing mocking jasmine angular-translate


    【解决方案1】:

    问题在于$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;
                }];
            });
        });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 2015-07-09
      相关资源
      最近更新 更多