2013-02-15 88 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