代码之家  ›  专栏  ›  技术社区  ›  zoul

如何使用NSUserDefaults进行测试?

  •  16
  • zoul  · 技术社区  · 14 年前

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

    @property(retain) NSUserDefaults *defaults;
    

    这样可以简化测试:

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

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

    3 回复  |  直到 14 年前
        1
  •  8
  •   zoul    14 年前

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

        2
  •  6
  •   w-m    14 年前

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

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

    但是假设您需要一些尚未注册的密钥,以便您的测试始终具有相同的初始点:然后在安装程序中删除它们(如果需要,稍后在tearDown中还原它们)。

    类似于:

    - (void) setUp {
      [super setUp];
    
      [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"myTestKey"];
    
      // synchronize the change, or just use resetStandardUserDefaults:
      [someObjectBeingTested setDefaults:[NSUserDefaults resetStandardUserDefaults]];
    }
    

        3
  •  0
  •   Jakob Egger    7 年前

    我们还需要重写NSUserDefaults进行测试,但不想更改任何应用程序代码。

    所以我们写了一个分类 NSUserDefaults 它允许我们重写 objectForKey:

    目标C中是这样的:

    NSLog(@"Value before: %d", [[NSUserDefaults standardUserDefaults] boolForKey:@"Example"]);
    // Value before: 0
    
    [[NSUserDefaults standardUserDefaults] overrideValue:@(YES) forKey:@"Example"];
    
    NSLog(@"Value after: %d", [[NSUserDefaults standardUserDefaults] boolForKey:@"Example"]);
    // Value after: 1
    

    像这样在斯威夫特:

    print(UserDefaults.standard.bool(forKey: "ExampleKey")) // false
    
    UserDefaults.standard.overrideValue(true, forKey: "ExampleKey")
    
    print(UserDefaults.standard.bool(forKey: "ExampleKey")) // true
    

    https://github.com/jakob/NSUserDefaultsOverride