Тестирование модулей Xcode - доступ к ресурсам из пакета приложений?

У меня проблема, и я хотел подтвердить, что я делаю все правильно.

Я могу проверить простые вещи с помощью тестов SenTestingKit, и это работает нормально. Я установил пакет Unit Test и установил его как зависимость от основной цели приложения. Он успешно запускает все тесты всякий раз, когда я нажимаю cmd + B.

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

Итак, у меня есть код, который выглядит так:

NSString *filePath = [[NSBundle mainBundle] 
    pathForResource:@"foo" ofType:@"xml"];

Это работает, когда приложение запускается, но во время unit test, mainBundle указывает на неправильный пакет, поэтому эта строка кода возвращает nil.

Поэтому я изменил его, чтобы использовать известный класс следующим образом:

NSString *filePath = [[NSBundle bundleForClass:[Config class]] 
    pathForResource:@"foo" ofType:@"xml"];

Это тоже не работает, потому что для того, чтобы тест даже скомпилировал такой код, он Config должен быть частью Unit Test Target. Если я добавлю это, то пакет для этого класса станет пакетом Unit Test. (Тьфу!)

Я подхожу к этому неправильно?

Ответы

Ответ 1

При попытке воспроизвести вашу проблему это ударило меня: вы пытались просто добавить свои ресурсы в свой тестовый комплект? Это вызовет проблемы для вас? Я сделал именно это, и это отлично поработало для меня. Например:

код:

- (void)testBundleLoading {
  NSLog(@"Main Bundle Path: %@", [[NSBundle mainBundle] bundlePath]);

  for (NSBundle *bundle in [NSBundle allBundles]) {
    NSLog(@"%@: %@", [bundle bundleIdentifier], 
                     [bundle pathForResource:@"fire" ofType:@"png"]);
  }
}

Вывод:

2010-05-05 14:31:05.961 otest[16970:903] Main Bundle Path: /Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator3.1.3.sdk/Developer/usr/bin
2010-05-05 14:31:05.962 otest[16970:903] (null): (null)
2010-05-05 14:31:05.963 otest[16970:903] com.freetimestudios.KayakKingTests: /Volumes/FreeTime/KayakKing/build/Debug-iphonesimulator/KayakKingTests.octest/fire.png

Надеюсь, это поможет.

Ответ 2

Я столкнулся с этой проблемой с Xcode 4, и моя проблема заключалась в том, что у меня был старый проект Xcode 3, и каким-то образом информационный слой для тестовой цели пропал без вести. Я добавил проект UnitTests-Info.plist в проект, и мне вдруг удалось снова получить ресурсы.