【问题标题】:How to use AppDelegate in test cases?如何在测试用例中使用 AppDelegate?
【发布时间】:2013-10-15 02:08:27
【问题描述】:

在多个类中,我使用[NSApp delegate] 从我访问某些属性的位置获取我的主 AppDelegate。这按预期工作,但是当我单元测试使用它的代码时,这个委托是nil

如何在我的测试中处理这个问题?能不能写个mock之类的?

【问题讨论】:

  • 这些是什么属性?听起来他们需要在不同的类中,而不是 App Delegate;也许使用单例模型。
  • 例如我有一个自定义的 UserSettings 属性。你是对的,也许把这个属性放在其他地方是有意义的。我只是将 AppDelegate 视为可从任何地方访问的全局类,这使其成为存储全局数据的不错选择。
  • 不过,在这种情况下,有一个不同的类很方便,它不作为应用程序的委托存储这些属性。它应该易于移动和实施。
  • 也许向 UserSettings 类添加一个静态方法是有意义的,它可以提供 UserSettings 对象的全局实例,我可以在我的应用程序周围的类中使用它。我应该只添加一个静态实例变量来保存这个实例和一个静态方法来传递它吗?这会是一个公平的解决方案吗?
  • 不,我认为使它成为一流,错误,一流,从长远来看会受益。真的一点工作都没有。

标签: objective-c macos xcode5 appdelegate xctest


【解决方案1】:

创建一个单独的单例类,可用于存储全局属性,并让 App Delegate 发挥其委托作用,仅此而已:

AppProperties.h:

@interface AppProperties : NSObject

@property (strong, nonatomic) NSString *prop1;
@property (strong, nonatomic) NSNumber *prop2;
@property (strong, nonatomic) NSMutableArray *prop3;

+ (AppProperties *)sharedInstance;

@end

AppProperties.m:

@implementation AppProperties

@synthesize prop1, prop2, prop3;

+ (AppProperties *)sharedInstance {
    static AppProperties *instance = nil;
    static dispatch_once_t onceToken = 0;
    dispatch_once(&onceToken, ^{
        instance = [[AppProperties alloc] init];
    });
    return instance;
}

@end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多