Как настроить кедр для тестирования 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-приложение.

  1. "Статическая структура Cedar-iOS", по-видимому, относится к следующей папке: ~ / Library / Developer / Xcode / DerivedData / Cedar-borwneaogydgaodbtmfyaccykqxn / Build / Products / Debug-iphoneuniversal / Cedar-iOS.framework. Не тот, с расширением.a.

  2. Я смог включить ARC без каких-либо проблем, так как статическая структура уже скомпилирована без ARC.

  3. Я также не увидел ни одного ключа "Main nib file base name" в моем info.plist
  4. Первый фрагмент кода - мой main.m для цели тестирования (мне нужно было изменить его, посмотрев main.m моего основного приложения)
  5. Второй фрагмент кода - это код спецификации, который находится в файле с именем "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
Другие вопросы по тегам