Как настроить кедр для тестирования bdd приложений ios?
Я пытаюсь настроить кедр и с трудом заставляю его работать. Я пытаюсь следовать инструкциям на github.
Я использую Xcode 4.2.
Первый шаг, в котором я не уверен, таков:
"Создайте приложение Cocoa Touch " Цель "для ваших тестов в проекте. Назовите эту цель UISpecs или что-то подобное".
а) Я не уверен, что смогу использовать ARC для основного приложения при тестировании с кедром. б) Я почти уверен, что не могу использовать ARC для создания самого кедра, и я не думаю, что хотел бы. c) Я не уверен, что смогу использовать ARC для тестового проекта, в котором будут храниться мои спецификации. d) Я не уверен, какой шаблон приложения мне следует использовать для создания приложения, в котором будут размещаться спецификации.
Я создал новое основное приложение, используя ARC и шаблон приложения с одним окном. Я создал новое приложение для размещения своих спецификаций без ARC, используя пустой шаблон приложения.
Когда я открываю файл plist.info для тестового приложения, в котором хранятся мои спецификации, я не вижу опции "Основное имя файла основного пера". Поэтому я игнорирую этот шаг.
Теперь я подхожу к шагу:
"Добавьте статическую платформу Cedar-iOS в свой проект и свяжите с ней цель UISpecs".
Поэтому я пошел к цели сборки приложения specs и добавил в проект файл ~/Library/Developer/Xcode/DerivedData/Cedar-borwneaogydgaodbtmfyaccykqxn/Build/Products/Debug-iphoneos/libCedar-StaticLib.a в разделе "связать двоичные файлы с библиотеками". "вкладка под вкладкой" этапы сборки ".
Затем я добавил -ObjC, -lstdC++ и -all_load в настройку сборки Другие флаги компоновщика для цели UISpecs.
Затем в приложении, в котором хранятся спецификации, я создал новый файл с именем TestSpec.m и добавил в него этот код, пытаясь получить ошибочную спецификацию:
#import <Cedar/SpecHelper.h>
SPEC_BEGIN(FooSpec)
describe(@"Foo", ^{
it(@"should do something", ^{
expect(0).to(equal(1));
});
});
SPEC_END
Когда я попытался запустить проект specs в симуляторе, я получил некоторые ошибки о alloc и autorelease, которые не поддерживаются при использовании ARC. Я предполагаю, что это означает, что мое основное приложение не может использовать ARC, в то время как мое специальное приложение не использует. Я удалил свое приложение спецификации и попытался снова, на этот раз используя ARC.
Я удалил пул авто-релиза и выпустил код из кода main.m для соответствия ARC.
Теперь я получаю две ошибки сборки:
1) в main.m: file://localhost/Users/nelsond/workspace/BIM360UIArchitecture/BIM360UIPrototype/BIM360Issues-IOS/BIM360Issues-IOS-Specs-ARC/main.m: ошибка: проблема с лексикой или препроцессором: 'Cedar-iOS Файл /Cedar-iOS.h'не найден 2) в TestSpec.m: file://localhost/Users/nelsond/workspace/BIM360UIArchitecture/BIM360UIPrototype/BIM360Issues-IOS/BIM360Issues-IOS-Specs-ARC/TestSpec.m:: Лексическая проблема или проблема препроцессора: файл "Cedar/SpecHelper.h" не найден
Я довольно озадачен тем, что отлаживать дальше.
2 ответа
А) вы можете использовать ARC для своей основной цели приложения.
б) не знаю, почему вы спрашиваете об этом, сам Cedar не должен быть построен с ARC. Во всяком случае, просто используйте конфигурацию по умолчанию, не нужно возиться с этим.
в) вы не должны использовать ARC для ваших тестовых классов.
d) если вы создаете новый проект, вы можете использовать автоматически созданную цель OCUnit по умолчанию.
Я использую Cedar со своими iOS-приложениями уже несколько месяцев, и мне это очень нравится.
Я использую это с OCUnit, так что я могу просто нажать Cmd+U
чтобы запустить мои тесты, и у меня есть специальная схема для запуска их с моего CI-сервера.
Я предпочитаю создать git submodule
чтобы получить код кедра, не редактируя его файлы. Вы можете просто перетащить проект XCed Cedar в рабочую область вашего приложения. Лучше всего использовать статическую библиотеку. Добавьте флаги компоновщика, как вы описали. Вам также нужно указать Xcode, где найти файлы заголовков (User Header Search Paths
с чем-то вроде "$(PROJECT_DIR)/Libraries/cedar/Source/Headers"
). Теперь вы должны быть готовы к работе.
Я отключаю ARC (см. Как отключить ARC для одного файла в проекте?) Для моих тестовых классов. Обратите внимание, что конфигурация ARC действительно специфична для файлов, поэтому вы можете включать файлы из вашей основной цели (с ARC) в свои тестовые файлы, они будут отлично смешиваться. Иногда немного сбивает с толку, но довольно мощный.
Надеюсь, это поможет.
Вот некоторые моменты, с которыми я столкнулся при интеграции Cedar в мое iOS-приложение.
"Статическая структура Cedar-iOS", по-видимому, относится к следующей папке: ~ / Library / Developer / Xcode / DerivedData / Cedar-borwneaogydgaodbtmfyaccykqxn / Build / Products / Debug-iphoneuniversal / Cedar-iOS.framework. Не тот, с расширением.a.
Я смог включить ARC без каких-либо проблем, так как статическая структура уже скомпилирована без ARC.
- Я также не увидел ни одного ключа "Main nib file base name" в моем info.plist
- Первый фрагмент кода - мой main.m для цели тестирования (мне нужно было изменить его, посмотрев main.m моего основного приложения)
- Второй фрагмент кода - это код спецификации, который находится в файле с именем "MyAppDelegateSpec.mm".
#import <UIKit/UIKit.h>
int main(int argc, char *argv[]) {
@autoreleasepool {
return UIApplicationMain(argc, argv, nil, NSStringFromClass([CedarApplicationDelegate class]));
}
}
#import "MyAppDelegate.h"
#import <Cedar-iOS/SpecHelper.h>
using namespace Cedar::Matchers;
SPEC_BEGIN(MyAppDelegateSpec)
describe(@"MyAppDelegate", ^ {
__block MyAppDelegate *appDelegate;
beforeEach(^{
appDelegate = [[MyAppDelegate alloc] init];
[appDelegate application:nil didFinishLaunchingWithOptions:nil];
});
afterEach(^{
appDelegate = nil;
});
it(@"initializes window", ^{
expect(appDelegate.window != nil).to(be_truthy());
});
});
SPEC_END