在 jasmine 中为 angularjs 设置全局变量
Setting global variables in jasmine for angularjs
我有一个 angular 应用程序,在 env.js 文件中定义了一些全局环境变量:
(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: 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' 的值注入工厂?我试过使用 $window,但没有用。
您应该完全避免在 Angular 中使用全局变量。
将文件转换为 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 模拟为不同的值(或者不做任何事情并使用代码中的值)
正如已经回答的那样 here,您还可以在测试文件中声明一个全局变量
var globalVar = "something";
describe('Your test suit', function() {
...
});
如果您使用的是 Karma,您可以编辑 karma.conf.js
文件来定义它
// list of files / patterns to load in the browser
files: [
...,
'file-containing-the-global-variable.js'
],
我有一个 angular 应用程序,在 env.js 文件中定义了一些全局环境变量:
(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: 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' 的值注入工厂?我试过使用 $window,但没有用。
您应该完全避免在 Angular 中使用全局变量。
将文件转换为 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 模拟为不同的值(或者不做任何事情并使用代码中的值)
正如已经回答的那样 here,您还可以在测试文件中声明一个全局变量
var globalVar = "something";
describe('Your test suit', function() {
...
});
如果您使用的是 Karma,您可以编辑 karma.conf.js
文件来定义它
// list of files / patterns to load in the browser
files: [
...,
'file-containing-the-global-variable.js'
],