objective-c - 在 UIViewController 中模拟 UIView

标签 objective-c cocoa unit-testing dependency-injection

考虑一个具有简单界面的 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/

相关文章:

bash - 使用 kcov/shunit2 测量已执行 shell 脚本的代码覆盖率

macos - SMJobBless 给出错误 CFErrorDomainLaunchd Code=8

macos - 窗口关闭时 window.beginSheet 崩溃

cocoa - 使用 CALayer 作为其他 NSView 的背景

ios - iOS本地化字符串阿拉伯格式

java - 如何使用参数化构造函数运行 junit

iphone - iOS:Sqlite 的单元测试

ios - #define 基于平台 [iPhone 或 iPad]

iphone - NSString 用单个换行符替换重复的换行符

iphone - iOS 上带有路由的静态 map