考虑一个具有简单界面的 UIViewController 的示例:
@interface MainViewController : UIViewController
@end
当它收到 viewDidLoad 或 viewDidAppear 消息时,它会创建并放置其他 View 。
在对其进行单元测试时,我想模拟这些 View ,因此我需要将接口(interface)更改为:
@interface MainViewController : UIViewController
@property (nonatomic) UIView *additionalView1
@property (nonatomic) UIView *additionalView2
@end
通过这样做,我将创建额外 View 的责任转移到调用方,在我看来,这打破了封装。
如何避免暴露如此多的 Controller 内部结构?
最佳答案
要支持 setter 注入(inject),您确实必须公开它。
有多种方法可以尝试隐藏它,或将其标记为禁区。您可以将属性声明包装在#if DEBUG 中。或者您可以将它们移至 MainViewController_Private 中的类扩展。
但我发现这些技巧只会让代码变得更加嘈杂。所以我的方法是继续揭露它们。正如我在Testability, Information Hiding, and the Class Trying to Get Out上指出的那样,这样的暴露可能是一个线索,表明可能需要提取一个类或转移职责。例如,既然你想注入(inject)这些 View ,那么 MainViewController 真的应该创建它们吗?也许紧张感导致我们创建了一个工厂,让 MainViewController 对这些 View 的细节一无所知。
关于objective-c - 在 UIViewController 中模拟 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14892454/