2016-12-04 116 views
1

有沒有什麼方法可以使用Crystal的內置spec庫來單元測試私有方法?如何測試私有方法?

我來自PHP背景,可以使用ReflectionMethod::setAccessibility將方法的可訪問性更改爲公開以允許對其進行測試。我在Crystal API文檔中找不到任何類似內容,所以只是想知道這樣的事情是否存在。

+3

根據傳統觀點,您不要單元測試私有方法。 –

+1

@ 500-InternalServerError小心分享一些來源來備份此聲明?方法的可見性與其是否正常工作無關,而確定它是否正常工作的唯一方法是通過測試它。從測試中排除所有私有方法聽起來像是一個有風險的策略。 –

+0

我聽到有人說班級設計應該是這樣的,不需要測試私人方法,因爲這些都是實現細節。但是,這種方法(如果全面的測試覆蓋率是目標),那麼結果將是一個粒度非常精細的類系統,其中使用了很多代表團。 – Codor

回答

2

我同意私人方法不應該被測試。然而,如果你真的想這樣做,你可以重新開放課程,並重新定義方法而不需要任何可見性(如此公開),並使用previous_def。例如:

class Foo 
    private def bar(x, y) 
    x + y 
    end 
end 

# Reopen 
class Foo 
    # Redefine bar 
    def bar(x, y) 
    # Invoke the previous definition 
    previous_def 
    end 
end 

foo = Foo.new 
p foo.bar(1, 2) 
+1

你真的覺得,測試你特別應該添加額外的方法嗎?您應該編寫測試來覆蓋您的代碼,但不要編寫運行測試代碼 –

+0

,只是不要在任何測試方法上使用私有修改器。就像任何帶有可見性修飾符的語言一樣。 Crystal允許重新打開類,但是,這很棘手。 –

0

如果Crystal紅寶石般的語言比私有方法應公開的方法進行測試。或使用代碼的地方使用