Добавление модульных тестов XCTest в существующее приложение не работает

Я добавил тесты (XCTests) в существующее приложение командной строки C ++ в Xcode 5

  • с помощью Тест Навигатор> (+),
  • изменил расширение тестового класса на .mm,
  • добавил Фреймворк XCTest к проекту.

Все компилируется нормально. Теперь выполнение тестов просто дает мне сообщение «Тест не пройден», ничего в консоли и ни зеленый, ни красный свет в Навигаторе (то есть тесты не выполняются).

Начиная с нового проекта Xcode 5 и изменяя расширение тестового класса на .mm просто отлично работает, поэтому я предполагаю, что это не просто отсутствие поддержки Objective-C ++ в XCTest.

Даже с простой, ванильной тестовой целью, добавленной к существующему проекту C ++, тесты не проходят прежде, чем когда-либо выполняться.

Есть ли еще какие-то ошибки, на которые стоит обратить внимание при добавлении XCTests к существующим (Objective-) целям C ++?

Обновление № 1

С Xcode 5.0.2 (на 10.8.5) xctest теперь падает в том же сценарии с

*** NSTask: Task create for path '/Users/XXX/Library/Developer/Xcode/DerivedData/RM_Next_Gen-gpihzjouhxvifqcslmywktktizer/Build/Products/Debug/YYY Tests.xctest/Contents/MacOS/YYY Tests' failed: 22, "Invalid argument".  Terminating temporary process.
objc[3478]: GC: forcing GC OFF because OBJC_DISABLE_GC is set
*** multi-threaded process forked ***

5

Решение

Оказывается, это был проект C ++ для командной строки, который, по-видимому, в настоящее время не поддерживается XCTest. Тестирование кода C ++ из проекта Objective-C (++) работает просто отлично ..

Просто надеемся на лучшее документирование XCTest в какой-то момент в (ближайшем) будущем.

4

Другие решения

Я не смог найти никакой документации по использованию XCTest для тестирования кода, который не является Objective C (C / C ++). Я хочу протестировать проект командной строки C, и я был обеспокоен тем, что ваш ответ предполагает, что это не поддерживается XCode. Я новичок в XCTest и TDD, но я думал, что другие могут оценить то, что я обнаружил.

Я создал New Project> Инструмент командной строки, основанный на C. Project называется Foo; Xcode назовет цель Foo по умолчанию тоже.

-Файлы созданы: main.c

Добавьте тестовую цель, перейдя в Test Navigator> (+)> New Test Target. Назови цель fooTests. Xcode создаст эту цель и пример теста внутри нее (все в файле с именем fooTests.m). Пример теста будет называться testExample и будет содержать следующую функцию теста:

- (void)testExample
{
XCTFail(@"No implementation for \"%s\"", __PRETTY_FUNCTION__);
}

Если вы сейчас запускаете тесты (либо из пункта меню «Продукт»> «Тест», либо ⌘U), то тест завершится неудачно (это должно быть). Для краткости я не буду проходить цикл TDD, а просто перечислю файлы и содержимое, которые необходимо добавить в тестовые функции, которые не входят в классы Objective-C.

Допустим, у нас есть функция, которую мы хотим протестировать, которая называется бар(), и позвонил с main.c. Перейдите в проводник проекта и добавьте новый заголовочный файл с именем bar.h. Добавьте прототип функции:

int bar();

Если вы хотите использовать XCTest для тестирования функции, она не может быть в main.c, поэтому добавьте ее в новый файл C Source с именем bar.c. Важно: когда вы добавляете файл, вы должны добавить его в целевой каталог и к fooTests. если вы не добавите его в fooTests, то при компиляции тестов компоновщик не найдет функцию.

int bar() {
return 0;
}

В fooTests.m добавьте:

#include "bar.h"

Теперь вы можете ссылаться на любую функцию, содержащуюся в bar.h в ваших тестах. Теперь создайте 2 модульных теста, один из которых провалится, а другой пройдет.

Удалите метод testExample и замените его следующим кодом:

- (void)testBarWillFail
{
int rc = bar();
XCTAssertTrue(rc == -1, @"Expected rc==-1, rc==%d", rc);
}

- (void)testBarWillPass
{
int rc = bar();
XCTAssertTrue(rc == 0, @"Expected rc==0, rc==%d", rc);
}

Запуск тестов приведет к появлению следующего в окне отладки:

Test Suite 'All tests' finished at 2014-01-12 13:38:45 +0000.
Executed 2 tests, with 1 failure (0 unexpected) in 0.000

В панели Issue Navigator вы увидите:

file: /foo/fooTests/fooTests.m: test failure: -[fooTests testBarWillFail] failed: ((rc == -1) is true) failed - Expected rc==-1, rc==0

Это все как и ожидалось! Повторите процесс со всем другим кодом C, который вы хотите протестировать.

Если кто-нибудь знает лучший способ сделать это, то я был бы рад услышать это!

3

По вопросам рекламы [email protected]