2015-06-14 58 views
2

我是新来的单元测试与JavaScript,我想用茉莉花2.3.4测试我的代码。我写了我的应用程序代码(main.js)并将其放入闭包中以避免全局变量,例如如何在闭包中显示代码,以便可以使用Jasmine对其进行单元测试?

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"); 
    }); 
}); 

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

回答

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,这意味着您的模块通常会保持较小,变化较少,并且更容易测试。

0

一个简单的方法是使用临时测试变量。变量内部封闭对外部世界是隐藏的,但不是相反方向

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"); 
});}); 
+0

这看起来不太好。您的产品代码将充满测试对象,令读者感到困惑并拖慢代码。 – Eero