我是使用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或模块加载器。谢谢。
答案 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");
});});