2015-06-16 117 views
1

我有在env.js文件中定義一些全局環境變量的角度應用:設置全局變量,茉莉爲angularjs

(function(sp) { 
'use strict'; 

pk.env = pk.env || {}; 

// localhost 
pk.env.baseUrl = 'http://localhost:8080/'; 
})(typeof exports === 'undefined' ? (this.pk = this.pk || {}) : exports); 

這些變量在多個工廠被用來製造REST API調用:

'use strict'; 

angular.module('pkApp').factory('pkFactory', PKFactory); 

function PKFactory($http) { 
    var urlBase = pk.env.baseUrl; 
    var apiUrl = 'v1/data'; 
    var _pkFactory = {}; 

    _pkFactory.getData = function() { 
     return $http.get(urlBase + apiUrl); 
    }; 


    return _pkFactory; 
} 

我使用茉莉花編寫單元測試的這個工廠,我不斷收到錯誤:

ReferenceError: Can't find variable: pk

如果我從工廠中刪除這個變量引用,測試運行良好。

'use strict'; 

console.log('=== In pk.factory.spec'); 

describe('Unit: pkFactory', function() { 

    beforeEach(module("pkApp")); 

    var $httpBackend, $rootScope, pkFactory; 

    beforeEach(inject(function($injector) { 
    // Set up the mock http service responses 
    $httpBackend = $injector.get('$httpBackend'); 

    $httpBackend.when('GET', 'v1/data').respond('Not found'); 

    pkFactory = $injector.get('pkFactory'); 

    })); 

    afterEach(function() { 
    $httpBackend.verifyNoOutstandingExpectation(); 
    $httpBackend.verifyNoOutstandingRequest(); 
    }); 

    it('expects getData method to be defined', function(){ 
    expect(pkFactory.getData()).toBeDefined(); 
    $httpBackend.flush(); 
    }); 
}) 

如何向工廠注入'pk.env.baseUrl'的值?我曾嘗試使用$窗口,但它沒有奏效。

+0

看起來IIFE功能會喜歡你聲明的環境變量限制它的範圍。 –

+0

那麼你是說我應該將其轉換爲角度常數或值? – imgr8

+0

是的......否則你需要將它變成全局的東西而不將它包裝到IIFE模式中? –

回答

4

你應該完全避免在Angular中使用全局變量。

將文件轉換成一個角度值或常量:

angular.module('pkApp').value('pk', pk); 

現在你可以改變pkFactory得到pk對象注入

function PKFactory($http, pk) { 
    // pk is no longer from global scope, but injected from angular as an argument 
    var urlBase = pk.env.baseUrl; 
    var apiUrl = 'v1/data'; 
    var _pkFactory = {}; 

    _pkFactory.getData = function() { 
     return $http.get(urlBase + apiUrl); 
    }; 


    return _pkFactory; 
} 

,並在測試中,你現在可以嘲笑的PK來一個不同的值(或不做任何事,並使用代碼中的一個)

4

由於已經很多已經回答here,你可以n您還可以測試文件

var globalVar = "something"; 

describe('Your test suit', function() { 
    ... 
}); 

內聲明一個全局變量,如果你使用的是因果報應,你可以編輯karma.conf.js文件來定義它

// list of files/patterns to load in the browser 
files: [ 
    ..., 
    'file-containing-the-global-variable.js' 
],