是否可以在不创建全局变量的情况下对客户端javascript进行单元测试?

是否可以在不创建全局变量的情况下对客户端javascript进行单元测试?,javascript,jasmine,client-side,Javascript,Jasmine,Client Side,我正在尝试用jasmine为客户端javascript编写单元测试 通常,我将客户端javascript封装在一个匿名函数中,如下所示 (function(){ // my code })() var foo = function(){ //my code } foo() 我遇到的问题是,我找不到一种方法让Jasmine可以使用它。我有没有办法让jasmine

我正在尝试用jasmine为客户端javascript编写单元测试

通常,我将客户端javascript封装在一个匿名函数中,如下所示

(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
的方法