2013-04-24 143 views
24

爲私有方法編寫測試是否很好?我應該使用RSpec測試私有方法嗎?

考慮以下簡單的例子:

class Group 
    has_many :members 

    private 

    def release_members 
    members.each { |member| member.update_attributes group_id: nil } 
    end 
end 

難道是寫在RSpec中的release_members方法測試好的做法呢?我相信你必須編寫測試調用發送ie的方法。 group.send(:release_members)這是有時皺起了眉頭。

+1

看來,紅寶石流氓有一個由桑迪梅斯播客,在這裏談論這個話題http://rubyrogues.com/087-rr-book-clubpractical-object-oriented-design-in-ruby-with-sandi-梅斯/。我們的觀點是,如果你喜歡,你可以測試私有方法(最終甚至可以刪除測試),但最重要的是調用私有方法的公共接口。 – 2013-04-24 16:33:00

回答

17

您可以在Sandi Metz演講的這些幻燈片中找到有關該主題的深入討論。

https://speakerdeck.com/skmetz/magic-tricks-of-testing-railsconf

她說,你可以試駕您的私有方法,如果你喜歡,但你應該擔心的唯一的測試是那些測試的公共接口。否則,你可能會與實現緊密結合。

我認爲這一點通過TOCH上分裂出去的服務和價值目標,並把那些在測試中也是,如果你正在擔心未測試複雜的私有方法是好的。

+0

感謝您指向我的鏈接。看起來像一個偉大的資源! – 2013-04-24 17:03:13

+1

鏈接已損壞。 – Oin 2014-03-21 10:42:10

28

您不應該測試私有方法,因爲它們屬於類的內部機制。單元測試的目的是檢查你的類在通過它的接口(即它的公共方法)進行交互時是否按預期行事。

如果在某一點上你長的私有方法不舒服,可能是因爲你在這裏有機會扳指邏輯類外另築模塊或類。然後,您可以對其進行單元測試,並再次僅對其界面進行測試,即其公共方法。

在某些罕見的情況下,有必要測試的私有方法,因爲整個內部邏輯是非常複雜的,你想分裂的問題。但在99.9%的情況下,測試私有方法是一個糟糕的主意。

+0

具有很多意義。它不是可選的,它不應該被測試給機會自由地調整他們並且只有當它打破外部API時擔心。 – 2014-05-09 19:08:48