Я добавил тесты (XCTests) в существующее приложение командной строки C ++ в Xcode 5
.mm
,Все компилируется нормально. Теперь выполнение тестов просто дает мне сообщение «Тест не пройден», ничего в консоли и ни зеленый, ни красный свет в Навигаторе (то есть тесты не выполняются).
Начиная с нового проекта 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 ***
Оказывается, это был проект C ++ для командной строки, который, по-видимому, в настоящее время не поддерживается XCTest. Тестирование кода C ++ из проекта Objective-C (++) работает просто отлично ..
Просто надеемся на лучшее документирование XCTest в какой-то момент в (ближайшем) будущем.
Я не смог найти никакой документации по использованию 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, который вы хотите протестировать.
Если кто-нибудь знает лучший способ сделать это, то я был бы рад услышать это!