如何使用NSUserDefaults进行测试?

zou*_*oul 16 cocoa unit-testing nsuserdefaults

在我的大多数使用默认值的类中,我将默认对象设置为可设置:

@property(retain) NSUserDefaults *defaults;
Run Code Online (Sandbox Code Playgroud)

这应该使测试更容易:

// In a nearby test class:
- (void) setUp {
    [super setUp];
    NSUserDefaults *isolatedDefaults = [[NSUserDefaults alloc] init];
    [someObjectBeingTested setDefaults:isolatedDefaults];
}
Run Code Online (Sandbox Code Playgroud)

但是现在我发现当我创建一个新的默认对象时,它已经有了一些值.那可能吗?我以为我可以通过调用创建一个空的,独立的默认对象-init.我是否在测试代码中的某处有错误,或者如果我想测试基于默认值的代码,我是否真的需要做一些更复杂的事情(如存根或模拟)?

zou*_*oul 8

最后,我创建了一个简单的NSUserDefaults替换,可用于控制测试中的默认环境.该代码可在GitHub上获得.


w-m*_*w-m 6

从NSUserDefaults文档:

init:返回使用当前用户帐户的默认值初始化的NSUserDefaults对象.

这通常不应该是空的.我不确定你想在这里测试什么,因为测试NSUserDefaults功能会浪费时间.

但是说你需要一些密钥才能让你的测试没有注册,总是有相同的初始点:然后在setUp中删除它们(如果你愿意,可以在tearDown中恢复它们).

就像是:

- (void) setUp {
  [super setUp];

  [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myTestKey"];

  // synchronize the change, or just use resetStandardUserDefaults:
  [someObjectBeingTested setDefaults:[NSUserDefaults resetStandardUserDefaults]];
}
Run Code Online (Sandbox Code Playgroud)

如果您没有特定的密钥列表但需要清除所有密钥,则必须使用CoreFoundation首选项实用程序,请参阅CFPreferencesCopyKeyList.