Это должно работать нормально. Я просто попытался в моем проекте, который использует XCTest на Xcode5, и этот код прошел.
Я бы 1) убедитесь, что вы используете последнюю версию OCMock (которая сейчас 2.2.1, я думаю, что есть некоторые исправления как для методов класса, так и для Xcode5 в более новых версиях) и 2) убедитесь, что ваш класс DetailViewController правильно связан в среде выполнения (то есть в части правильной цели).
Рассматривая свой проект, ваш класс DetailViewController является частью основного приложения, и контрольной целью.С Xcode5 кажется, что это означает, что две копии класса компилируются и присутствуют во время выполнения, с кодом в приложении, вызывающим одну копию, и кодом в тестовом случае, вызывающим другое. Раньше это была ошибка компоновщика (дубликаты символов), но, к лучшему или худшему, теперь компоновщик теперь молчаливо разрешает существование двух экземпляров того же класса (с тем же именем) в среде выполнения ObjC. OCMock, используя динамический поиск, находит первый (тот, который скомпилирован в приложение), но тестовый пример напрямую связан со второй копией (той, которая скомпилирована в тестовый комплект). Итак ... OCMock на самом деле не насмехается над классом, который, как вы думаете.
Вы можете видеть это, только для усмешек, проверив как часть тестового примера, что класс [DetailViewController] не будет равен NSClassFromString (@ «DetailViewController») (первый напрямую связан, второй - динамический).
Чтобы исправить это правильно, в «Целевом членстве» для DetailViewController.m просто снимите контрольную цель. Таким образом, во время выполнения есть только одна копия класса, и все работает так, как вы ожидали. Комплект тестирования загружается в основное приложение, поэтому все классы основного приложения должны быть доступны для пакета без необходимости их непосредственного компиляции в пакет. Классы должны быть только частью одной из двух целей, а не обоими (это всегда было так).
Похоже, что он должен работать ... Предполагаю, что DetailViewController.h включен в ваш тест? Можете ли вы назвать «helloWorld» без использования mocks? –
yes 'DetailViewController.h' включен в тест и заменен заглушкой метода класса с регулярным заглушкой (та же самая мировая подпись и т. Д.) .. и это не сработало .. – abbood
@BenFlynn Я просто создал очень простой [ repo] (https://github.com/abbood/very-simple-oc-mock-stub-example/blob/master/verySimpleOCMockStubExampleTests/otherTests.m) для демонстрации проблемы, которую я получаю. Если вы можете взять быстро заглянуть, что было бы здорово! – abbood