【发布时间】:2015-06-16 20:07:56
【问题描述】:
我有一个在 env.js 文件中定义了一些全局环境变量的 Angular 应用程序:
(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;
}
我正在使用 Jasmine 为这个工厂编写单元测试,但我不断收到错误:
ReferenceError:找不到变量: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' 的值注入工厂?我曾尝试使用 $window,但它没有用。
【问题讨论】:
-
看起来你已经在 IIFE 函数中声明了环境变量,这将限制它的范围。
-
所以你是说我应该把它转换成一个角度常数或值?
-
是的......否则你需要让它成为全局的东西而不将它包装到 IIFE 模式中?
-
所以我删除了 IIFE 包装器,并尝试使用 $window 设置值,但它仍然不起作用。仍然出现同样的错误。
-
我添加了这个:module(function($provide) { var pk = {} pk.env = {}; pk.env.baseUrl = ''; $provide.value('$window' , pk); });
标签: javascript angularjs jasmine karma-jasmine