2013-02-15 85 views
1

當我在使用簡單的界面的UIViewController考慮這樣一個例子:模擬的UIView在UIViewController中

@interface MainViewController : UIViewController 
@end 

當它接收它創建viewDidLoad中或viewDidAppear消息,並將附加視圖。

當單元測試它,我想小樣這些意見,所以我需要改變接口這樣的:

@interface MainViewController : UIViewController 

@property (nonatomic) UIView *additionalView1 
@property (nonatomic) UIView *additionalView2 

@end 

通過這樣做,我創建移動調用方補充意見的責任,在我看來,它打破封裝。

如何避免暴露如此多的控制器內部?

+0

有趣的問題,我同意這肯定打破封裝。另外,什麼是「單元測試視圖控制器時只有一種可能的解決方案嗎?」意思? – 2013-02-15 11:20:00

+0

我已經迴避了我的問題。 – goodfella 2013-02-15 11:46:52

回答

2

爲了支持setter注入,你真的必須公開它。

有些方法試圖隱藏它,或將其標記爲禁止。您可以將屬性聲明包裝在#if DEBUG中。或者您可以將它們移動到MainViewController_Private中的類擴展。

但是我發現這些技巧只會使代碼變得更加嘈雜。所以我的方法是繼續前進並揭露它們。正如我在Testability vs. Information Hiding上指出的那樣,這樣的暴露可能是一個線索,可能需要提取一個課程,或者職責轉移。例如,既然你想注入這些視圖,MainViewController是否真的要創建它們?也許這種緊張狀態導致我們製造一個工廠,讓MainViewController不知道這些視圖的細節。

+0

工廠聽起來像是一個非常好的解決方案,謝謝。 – goodfella 2013-02-15 17:51:31