Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jasmine中为angularjs设置全局变量_Javascript_Angularjs_Jasmine_Karma Jasmine - Fatal编程技术网

Javascript 在jasmine中为angularjs设置全局变量

Javascript 在jasmine中为angularjs设置全局变量,javascript,angularjs,jasmine,karma-jasmine,Javascript,Angularjs,Jasmine,Karma Jasmine,我有一个角度应用程序,在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

我有一个角度应用程序,在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:找不到变量: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,但不起作用

您应该避免在完全有角度的情况下使用globals

将文件转换为角度值或常量:

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模拟为不同的值(或者不做任何事情并使用代码中的值)

正如已经回答的那样,您还可以在测试文件中声明一个全局变量

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'
 ],

看起来你已经在IIFE函数中声明了环境变量,这将限制它的作用域。那么你是说我应该将它转换为角度常量或值吗?是的……否则你需要使它成为全局变量,而不将其包装到IIFE模式中?所以我移除了IIFE包装器,并尝试使用$window设置值,但仍然不起作用。仍然收到相同的错误。我添加了以下内容:模块(函数($provide){var pk={}pk.env={};pk.env.baseUrl='';$provide.value('$window',pk);});