2012-03-06 6 views
5

Я пытаюсь использовать OCMock впервые в своих тестовых случаях. Это проект Mac, построенный и ориентированный на Lion, в Xcode 4.3. Главное приложение и тестовый пакет оба ARC включены, и поэтому каждый раз, когда я выполнение тестов я вижу следующее сообщение журнала:OCMock Ошибка во время выполнения

GC: forcing GC OFF because OBJC_DISABLE_GC is set

Это хорошо, так как я использую ARC, так что я не» заботиться о GC. Когда я строю свои модульные тесты, связанные с последней стабильной версией OCMock (2.0.1), сборка не имеет проблем. Во время выполнения, после вышеуказанного журнала заявления, я получаю следующее:

The test bundle at /Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest could not be loaded because its Objective-C runtime information does not match the runtime information required by the test rig. This is likely because the test rig is being run with Objective-C garbage collection disabled, but the test bundle requires Objective-C garbage collection. To enable Objective-C garbage collection for the test rig, run it in an environment without the OBJC_DISABLE_GC environment variable. 2012-03-06 10:29:32.812 otest[8486:203] *** NSTask: Task create for path '/Users/___/Library/Developer/Xcode/DerivedData/___-ayizwpehemunvodsdvczckkvarsh/Build/Products/Debug/___Tests.octest/Contents/MacOS/___Tests' failed: 22, "Invalid argument". Terminating temporary process.

сообщение означает, что сбор мусора является наиболее распространенной причиной, но, как уже упоминалось, нет никакого способа, я использую GC. Итак, какие другие настройки могли бы запутать меня во время выполнения? Я не думал, что я делаю что-то нетипичное, и я просмотрел настройки своего тестового проекта, чтобы убедиться, и не видел ничего странного.

Update

Я был в состоянии воспроизвести это с новым пустым проектом.

  1. Создайте новый проект и его создание модульных тестов с поддержкой ARC
  2. Очистить Test Host настройки из настроек сборки модульного тестирования Bundle в
  3. Ссылки на рамки OCMock
  4. Выполнить тесты, и свидетель ту же ошибку я сообщил выше

Кроме того, когда я отключить ARC и сделать сбор мусора Обязательный, затем clang сообщает о ошибке компоновщика mach-o, поэтому сборка не выполняется. Если я удалю ссылку на среду OCMock, она строит отлично. Это подтверждает мою первоначальную мысль о том, что проблема лежит где-то, кроме сбора мусора.

+0

Он говорит, что это, вероятно, не работает, потому что GC выключен. «для тестового пакета требуется сбор мусора Objective-C». Поэтому постарайтесь не устанавливать OBJC_DISABLE_GC. – vakio

+0

@vakio «тестовый комплект» - это мой собственный тестовый код, и он использует ARC, поэтому GC отключен. Это сообщение - это всего лишь намек на то, что обычно неправильно в среде выполнения. Я попытался включить GC, но LLVM не удается, возможно, потому, что ARC и GC не могут сосуществовать. – Dov

ответ

18

Я нашел ответ, после дня поисков все, что я мог думать, в Hamcrest tutorial (чтение более тщательно через OCMock tutorial связанный с OCMock.org, он упоминается там тоже). По какой-то причине рамки Hamcrest и OCMock необходимо скопировать в каталог продуктов. Тогда все работает как шарм.

  1. Перейти к настройкам для ваших тестов Bundle
  2. Перейти к Строительства фазам Вкладка
  3. Нажмите Добавить Построить Phase кнопку и выберите Добавить Копировать файлы
  4. Установите новый Фазы сборки факсимильных файлов 'Направление до Каталог продуктов
  5. Перетащите OCMock.рамки из набросков проекта в список файлов для фазы
  6. Перетащите фазы копирования файлов выше фазы Run Script

Выполнить тесты как обычно

+1

Оба OCHamrest и OCMock построены с помощью '@ rpath' в пути загрузчика. Это заставляет их работать в каталоге продуктов, потому что это по умолчанию. Вы можете использовать 'LC_RPATH' и другие средства, чтобы обеспечить вам большую гибкость. См. Обсуждение '@ rpath' на странице' dyld' man. –

+0

Интересно, спасибо за объяснение. – Dov

+0

У меня была такая же проблема с моим проектом, который включает рамку Growl. Решение было тем же, спасибо! – mrwalker

Смежные вопросы