1

当我使用简单界面的 UIViewController 时,考虑一个示例:

@interface MainViewController : UIViewController
@end

当它接收到 viewDidLoad 或 viewDidAppear 消息时,它会创建并放置额外的视图。

当对它进行单元测试时,我想模拟这些视图,所以我需要将接口更改为:

@interface MainViewController : UIViewController

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

@end

通过这样做,我将创建额外视图的责任转移到调用方,在我看来,这会破坏封装。

我怎样才能避免暴露这么多控制器内部?

4

1 回答 1

2

要支持 setter 注入,您确实必须公开它。

有一些方法可以尝试隐藏它,或者将其标记为禁区。您可以将属性声明包装在#if DEBUG. 或者您可以将它们移动到 MainViewController_Private 中的类扩展。

但我发现这些技巧只会让代码更嘈杂。所以我的方法是继续揭露它们。正如我在可测试性、信息隐藏和试图退出的类中指出的那样,这种暴露可能是一个线索,表明一个类可能需要被提取,或者职责转移。例如,既然要注入这些视图,那么 MainViewController 真的应该创建它们吗?也许紧张导致我们做一个工厂,让 MainViewController 对这些视图的细节一无所知。

于 2013-02-15T17:18:05.757 回答