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

时间:2015-02-27 11:03:17

标签: javascript jasmine client-side

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

通常我将客户端javascript包装在像这样的匿名函数中

(function(){ 
            // my code
           })()

我遇到的问题是我无法找到让Jasmine可以访问的方法。有没有办法让我可以使用“我的代码”进行茉莉花测试,而不需要做这样的事情

var foo = function(){
                      //my code
                     }
foo()

1 个答案:

答案 0 :(得分:2)

如果你想要任何外部代码(不仅仅是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的方法。