是否可以在不创建全局变量的情况下对客户端javascript进行单元测试?
我正在尝试用jasmine为客户端javascript编写单元测试 通常,我将客户端javascript封装在一个匿名函数中,如下所示是否可以在不创建全局变量的情况下对客户端javascript进行单元测试?,javascript,jasmine,client-side,Javascript,Jasmine,Client Side,我正在尝试用jasmine为客户端javascript编写单元测试 通常,我将客户端javascript封装在一个匿名函数中,如下所示 (function(){ // my code })() var foo = function(){ //my code } foo() 我遇到的问题是,我找不到一种方法让Jasmine可以使用它。我有没有办法让jasmine
(function(){
// my code
})()
var foo = function(){
//my code
}
foo()
我遇到的问题是,我找不到一种方法让Jasmine可以使用它。我有没有办法让jasmine可以使用“我的代码”进行测试,而不用做类似的事情
(function(){
// my code
})()
var foo = function(){
//my code
}
foo()
如果您希望任何外部代码(不仅仅是Jasmine)能够使用您编写的任何部分,那么它必须在某种程度上是全局的。这并不意味着您必须公开每个变量和函数,但与任何软件模块一样,任何旨在公开的内容都必须公开 例如,如果您有以下代码:
var purchaseAmount = 50;
var taxRate = 0.08;
function CalculateBill() {
return purchaseAmount + ComputeTax();
}
function ComputeTax() {
return purchaseAmount * taxRate;
}
您的第一种方法将隐藏所有这些内容,使其不会在其他任何地方使用:
(function () {
//Everything from the previous code sample
alert(CalculateBill());
})();
//Jasmine has no access to CalculateBill()
您可以做的是创建一个类,只公开需要公开的内容:
function FinancialCalculator(taxRate) {
function ComputeTax(purchaseAmount) {
return purchaseAmount * taxRate;
}
this.CalculateBill = function(purchaseAmount) {
return purchaseAmount + ComputeTax(purchaseAmount);
}
}
Jasmine可以做这样的事情:
describe("Financial Calculator", function() {
it("Calculates the bill correctly", function() {
expect(new FinancialCalculator(0.08).CalculateBill(50)).toEqual(54);
});
});
而ComputeTax()
和其他底层实现细节仍然隐藏
如果一个类不太适合您的情况,您可以使用一个全局对象,类似地公开公开公开所需的内容。这是jQuery和Knockout.js分别使用$
和ko
的方法