2013-03-06 30 views
2
(function(window,document){ 

    var _trimString = function(string){ 
    var trimString; 
    trimString = string.replace(/^\s+|\s+$/g,''); 
    return trimString 
    }; 

    var displayCorrectText = function(incorrecttext){ 
    correctText = "."+incorrecttext; 
    document.write(correctText); 
    } 

    var Circular = function(){}; 

    Circular.prototype.init = function(string){ 
    displayCorrectText(_trimString(string)); 
    }; 

    var circular = new Circular(); 
    window.circular = circular; 
})(window,document); 

circular.init('asd.asd'); 

我有這個模塊聲明,我想用茉莉花來測試_trimString功能。如何測試內部函數,這是需要供內部使用,使用茉莉花

我寫了這樣的代碼

describe("Form Creator private function ", function(){ 
it("_trimString should trim string", function(){ 
    var _trimString = function(string){ 
     var trimString; 
     trimString = string.replace(/^\s+|\s+$/g,''); 

     return trimString 
    }; 
expect(_trimString(' test text ')).toBe('test text'); 
}); 

});

我做得對,在測試中聲明函數本身,還是有另一種方式? 如果我做了這樣的功能測試,我想錯誤的是在源代碼中複製實際功能。也許,有人可以告訴我在模塊聲明中使用「私人」功能的正確案例

回答

2

我同意Andy Waite:一般來說,你只應該測試公共接口方法。

但是,如果您認爲這種私有方法確實需要直接測試,那麼這可能是一個問題的症狀。它聞起來像這種方法做了太多的工作(或者至少是你認爲重要的工作)。如果是這種情況,請考慮將其邏輯抽取到服務對象中並委託給它。這樣便於分開測試服務對象。

編輯:

在代碼:

var Circular = function(){ 
    this.trimmer = new Trimmer(); 
}; 

Circular.prototype.init = function(string){ 
    this.displayText = this.trimmer.trim(string); 
}; 

var circular = new Circular(); 
circular.init(" test ").displayText // should be trimmed 

... 

// test trimmer separately 
describe("Trimmer", function(){ 
    it("trims string", function(){ ... }); 
}); 
1

一般而言,您應該只測試公共接口方法。

您的初始化程序正在調用_trimString,因此您可以通過它隱式測試它。

例如:

it("trims whitespace"), function(){ 
    var circular = Circular.new(' foo ') 
    expect(circular.text).toBe('foo') 
} 

您可能需要調整一些現有的代碼使這個更容易測試。 displayCorrectText目前有兩個不同的職責 - 操縱一些字符串並打印結果,這違反了單一責任原則。

+0

你能不能請,顯示它在代碼或提供一些例子嗎? – 2013-03-06 15:00:34

+0

我已經添加了一個大綱示例 – 2013-03-06 15:07:32