XCTest не работает при вызове

У меня есть код, который в определенный момент вызывает [NSBundle mainBundle] , в основном для чтения / установки предпочтений. Когда я тестирую метод, тест терпит неудачу, потому что mainBundle теста не содержит файл.

Это известная проблема , что Apple не будет исправлять, поскольку считает, что это не ошибка :

суть их ответа заключается в том, что XCTest работает правильно, возвращая его собственный основной пакет вместо пакета тестовой цели.

Раньше наша база кода использовала переопределение категории в +mainBundle класса +mainBundle чтобы обойти это. Но это опасно, потому что поведение переопределения существующего метода в категории не определено .

Если имя метода, объявленного в категории, такое же, как метод в исходном классе, или метод в другой категории в том же классе (или даже в суперклассе), поведение не определено в отношении того, какой метод реализации используется в во время выполнения.

На самом деле Xcode предупреждает вас об этом:

Категория реализует метод, который также будет реализован его основным классом

Итак, каков надлежащий метод решения этой проблемы?

Самый простой и чистый способ решить эту проблему – частично издеваться над классом NSBundle в ваших модульных тестах, чтобы вернуть [NSBundle bundleForClass:[self class]] когда вы вызываете [NSBundle mainBundle] .

Вы можете поместить это в свой метод -setup чтобы он высмеивался для всего тестового класса:

 static id _mockNSBundle; @implementation MyTests - (void)setUp { [super setUp]; _mockNSBundle = [OCMockObject niceMockForClass:[NSBundle class]]; NSBundle *correctMainBundle = [NSBundle bundleForClass:self.class]; [[[[_mockNSBundle stub] classMethod] andReturn:correctMainBundle] mainBundle]; } @end 

Хороший и чистый.

[ Источник ]

  • Тестирование iOS: dispatch_once вызывается дважды. Сначала в приложении, второй в тесте. Проблемы с наблюдателями
  • После переименования проекта я не нашел <XCTest / XCTest.h>.
  • XCTAssertEqual: Как сравнить NSDates?
  • Как протестировать элементы UIImageView в iOS XCTest?
  • используя в XCTests
  • XCTestCase для CoreData завершается с ошибкой: «не удалось найти объект для myappTests.Example»
  • Как проверить несколько XCTestExpectations, используя предикат, проверяющий атрибут hittable в XCTest
  • Запустить пакет XCTest с помощью simctl
  • Выбор рамок тестирования iOS
  • XCTests не запускает приложение в симуляторе с перерывами
  • Доступность не отображает кнопки утилиты SWTableViewCell
  • Interesting Posts

    Странный сбой при представлении контроллера

    Xcode не может работать с выбранным устройством

    Что происходит с существующим приложением iOS при обновлении?

    Соединение Bluetooth 3.0 на IOS с использованием IAP2

    Удалите фон из изображения и возьмите только часть изображения для сохранения в iOS

    NSURLSession и загрузка потока в фоновом режиме

    AFNetworking не имеет плюрализует мои объекты модели данных правильно

    Замораживание камеры при открытии приложения во время вызова

    Как я могу контролировать значение UISlider Value Changed-events frequncy?

    Требования к представлению Apple для приложений iPhone

    Ввод байтового значения в NSDictionary

    Отправка и получение файлов cookie на / из сервера в Swift

    Как добавить ссылку на веб-сайт с помощью кнопки и вернуться в приложение

    Как добавить несколько CALayer в видеофайл с помощью AVMutableComposition и CALayers на iOS

    Эффективный способ разобрать сложный массив JSON

    Давайте будем гением компьютера.