簡體   English   中英

在angularjs中為jasmine設置全局變量

[英]Setting global variables in jasmine for angularjs

我有一個角度應用程序,在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,但它沒有用。

你應該完全避免在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模擬為不同的值(或者不做任何事情並使用代碼中的那個)

正如此處已經回答的那樣,您還可以在測試文件中聲明一個全局變量

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM