如何在一个闭包中公开代码,以便可以使用Jasmine进行单元测试?

时间:2015-06-14 15:47:18

标签: javascript unit-testing jasmine

我是使用JavaScript进行单元测试的新手,我正在尝试使用Jasmine 2.3.4测试我的代码。我编写了我的应用程序代码(main.js)并将其放在一个闭包中以避免全局变量,例如

main.js

(function(){
  var baseURL = "https://google.co.uk";
   // rest of application.. 
})();

以下是我开始使用的测试代码:

mainSpec.js

describe('Document setup should set the base URI', function () {
  it('Base URI', function () {
    expect(baseURI).toEqual("https://google.com");
  });
});

我遇到的问题是我不知道如何在main.js中的匿名函数中公开代码,以便可以在mainSpec.js中进行测试。使我的测试代码可以访问main.js中的代码的最佳方法是什么?我没有使用Require或模块加载器。谢谢。

2 个答案:

答案 0 :(得分:1)

您需要通过模拟baseURI使用的代码之外的内容来测试这一点。例如,您的代码可能会执行$.get(baseURI + '/something', ...);然后您将使用存根$.get并期望使用以baseURI开头的URI调用它。

如果是一个选项,使用CommonJS可以使测试更容易。你可以让模块这样说:

function MyClass(baseURI) {
  this.baseURI = baseURI;
}

module.exports = MyClass;

MyClass.prototype.getURI() {
  return this.baseURI;
}

...

然后你可以通过这样做来测试它:

var MyClass = require('./myClass);

describe('MyClass', function() {
  it('uses the set baseURI', function() {
    var myClass = new MyClass('https://google.com');

    expect(myClass.getBaseURI()).toEqual('https://google.com');
  });

  ...
});

使用大多数CommonJS工具,您还可以模拟或代理模块所依赖的模块(例如,使用Browserify,我使用proxyquireify)。这样您就可以测试它与其他模块的交互方式。如果您遵循Single Responsibility Principle,这意味着您的模块通常会保持较小并且更换频率较低且更容易测试。

答案 1 :(得分:0)

一种简单的方法是使用临时测试变量。变量INSIDE一个闭包是隐藏在外部世界,但不是相反的

var test={};

(function(){
   var baseURL = "https://google.co.uk";
   // rest of application.. 

   test.baseURL=baseURL;
})();

Describe('Document setup should set the base URI', function () {
it('Base URI', function () {
   expect(test.baseURL).toEqual("https://google.com");
});});