Подтвердить что ты не робот

Как протестировать NSUserDefaults?

В большинстве моих классов, которые работают с настройками по умолчанию, я устанавливаю объект по умолчанию:

@property(retain) NSUserDefaults *defaults;

Это должно облегчить тестирование:

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

Но теперь я обнаружил, что когда я создаю новый объект по умолчанию, в нем уже есть некоторые значения. Это возможно? Я думал, что могу создать пустой изолированный объект по умолчанию, вызвав -init. У меня есть ошибка где-то в тестовом коде, или мне действительно нужно сделать что-то более сложное (например, stubbing или mocking), если я хочу проверить свой код на основе по умолчанию?

4b9b3361

Ответ 1

В конце концов я создал простую замену NSUserDefaults, которая может использоваться для управления средой по умолчанию в тестах. Код доступен на GitHub.

Ответ 2

В документации 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]];
}

Если у вас нет определенного списка ключей, но вам нужно стереть все, вам придется использовать Утилиты настроек CoreFoundation, см. CFPreferencesCopyKeyList.