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

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

16 голосов
/ 20 октября 2010

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

@property(retain) NSUserDefaults *defaults;

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

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

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

Ответы [ 3 ]

8 голосов
/ 29 ноября 2010

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

6 голосов
/ 21 октября 2010

Из документации 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 Preferences, см. CFPreferencesCopyKeyList.

0 голосов
/ 28 марта 2018

Нам также нужно было переопределить NSUserDefaults для тестирования, но мы не хотели изменять код приложения.

Поэтому мы написали категорию на NSUserDefaults, которая позволяет нам переопределять значения, возвращаемые * 1004.* во время выполнения с использованием метода Swizzling.

Это выглядит так в Objective 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

И так в Swift:

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

UserDefaults.standard.overrideValue(true, forKey: "ExampleKey")

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

Вы можете найти наш кодна Github: https://github.com/jakob/NSUserDefaultsOverride

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...