Xcode восстанавливает файлы в связке между юнит-тестами - PullRequest
0 голосов
/ 24 февраля 2019

Я пишу серию модульных тестов для класса, который требует список свойств, хранящийся в комплекте.Я сохраняю фиктивную версию этого списка свойств в своей цели модульного теста и внедряю комплект модульного теста в класс, чтобы его можно было прочитать.Один из моих модульных тестов касается обработки случая, когда файл не может быть найден, поэтому я просто удаляю его из комплекта следующим образом:

NSString *plistPath = [self.bundle pathForResource:kInAppPurchasesPlistName ofType:@"plist"];
[[NSFileManager defaultManager] removeItemAtPath:plistPath error:nil];

Однако это приводит к проблемам, поскольку файл теперь удаляется изсвязка, даже между тестами.Если я правильно настрою свои тесты, это может не быть проблемой, но с рандомизированным порядком выполнения это так.

Я «воссоздаю» пакет между юнит-тестами:

- (void)setUp {
    [...]
    self.bundle = [NSBundle bundleForClass:[self class]];
    [...]
}

- (void)tearDown {
    [...]
    self.bundle = nil;
    [...]
}

Хотя я подозреваю, что базовый пакет не изменяет и не сбрасывает состояние при этом.

Каков наилучший способ сделать это?Таким образом, мне нужен способ, который позволит мне «вставить» поддельный файл в мой класс, который читает его из пакета.Я хочу удалить этот файл в некоторых тестах, но для полного сброса состояния после каждого отдельного теста.

1 Ответ

0 голосов
/ 27 февраля 2019

Тесты должны быть изолированными, чтобы вы могли запускать их по отдельности или в любом порядке.Если тест на самом деле что-то удаляет, вам придется вернуть его обратно.

Опасность внесения изменений в файловую систему заключается в том, что это постоянное изменяемое состояние, разделяемое между тестами.Вместо того чтобы напрямую общаться с NSFileManager, я рекомендую вместо этого ввести его.В зависимости от вашего кода это можно сделать с помощью параметра инициализации (предпочтительно) или свойства (второе место).Вы можете даже заставить свой производственный код использовать свойство lazy, чтобы оно использовало [NSFileManager defaultManager] по умолчанию, если только не был добавлен другой экземпляр.

Чтобы внедрить поддельную версию NSFileManager, которой могут управлять ваши тесты, я рекомендуюиспользуя OCMockito или OCMock.

...