0

我正在尝试设置雪松,但很难让它工作。我正在尝试按照 github 上的说明进行操作。

我正在使用 xcode 4.2。

我不确定的第一步是:

“为项目中的测试创建一个 Cocoa Touch “应用程序”目标。将此目标命名为 UISpecs 或类似名称。”

a) 我不确定在使用 cedar 进行测试时是否能够将 ARC 用于我的主要应用程序。b)我很确定我不能使用 ARC 来构建雪松本身,我想我也不想这样做。c) 我不确定我能否将 ARC 用于包含我的规格的测试项目。d) 我不确定我应该使用哪个应用程序模板来创建应用程序来容纳规范。

我使用 ARC 和单窗口应用程序模板创建了一个新的主应用程序。我使用空的应用程序模板创建了一个新的应用程序来容纳我的规格而没有 ARC。

当我打开包含我的规格的测试应用程序的 plist.info 文件时,我没有看到“主 nib 文件基本名称”选项。所以我忽略了这一步。

现在我来一步:

“将 Cedar-iOS 静态框架添加到您的项目中,并将您的 UISpecs 目标与其链接。”

所以我去了规范应用程序构建目标并将 ~/Library/Developer/Xcode/DerivedData/Cedar-borwneaogydgaodbtmfyaccykqxn/Build/Products/Debug-iphoneos/libCedar-StaticLib.a 文件添加到项目中的“链接二进制文件与库" “构建阶段”选项卡下的选项卡。

然后,我将 -ObjC、-lstdc++ 和 -all_load 添加到 UISpecs 目标的 Other Linker Flags 构建设置中。

接下来,在包含规范的应用程序下,我创建了一个名为 TestSpec.m 的新文件并将此代码添加到其中,以尝试获取失败的规范:

#import <Cedar/SpecHelper.h>

SPEC_BEGIN(FooSpec)
describe(@"Foo", ^{
    it(@"should do something", ^{
        expect(0).to(equal(1));
    });
});
SPEC_END

当我尝试在模拟器中运行 specs 项目时,我遇到了一些关于使用 ARC 时不支持 alloc 和 autorelease 的错误。我想这意味着我的主应用程序不能使用 ARC,而我的规范应用程序没有。我删除了我的规范应用程序并再次尝试,这次使用 ARC。

我从 main.m 代码中删除了自动释放池和释放代码以符合 ARC。

我现在得到两个构建错误:

1)在main.m中:文件://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”文件

我很困惑接下来要调试什么。

4

2 回答 2

2

a) 您可以将 ARC 用作您的主要应用目标。

b)不确定您为什么要问这个问题,Cedar 本身不应该使用 ARC 构建。无论如何,只需使用默认配置,无需搞砸。

c) 你不应该在你的测试类中使用 ARC。

d) 如果您创建一个新项目,您可以使用默认的自动生成的 OCUnit 目标。


几个月以来,我一直在我的 iOS 应用程序中使用 Cedar,我真的很喜欢它。

我将它与 OCUnit 一起使用,因此我可以直接Cmd+U运行我的测试,并且我有一个特定的方案可以从我的 CI 服务器运行它们。

我更喜欢创建一个git submodule来获取 Cedar 的代码,而无需编辑其文件。您可以简单地将 Cedar 的 Xcode 项目拖到应用程序的工作区中。最好使用静态库。如您所述,添加链接器标志。你还需要告诉 Xcode 在哪里可以找到头文件(User Header Search Paths,类似的东西"$(PROJECT_DIR)/Libraries/cedar/Source/Headers")。现在你应该准备好了。

我为我的测试类禁用了 ARC(请参阅如何为项目中的单个文件禁用 ARC? )。请注意,ARC 配置实际上是特定于文件的,因此您可以将主要目标(使用 ARC)中的文件包含到测试文件中,它们会很好地混合。有时有点混乱,但非常强大。

希望这能有所帮助。

于 2012-05-14T22:23:18.913 回答
0

以下是我在 iOS 应用程序中集成 Cedar 时遇到的一些问题。

  1. “Cedar-iOS 静态框架”似乎是指以下文件夹:~/Library/Developer/Xcode/DerivedData/Cedar-borwneaogydgaodbtmfyaccykqxn/Build/Products/Debug-iphoneuniversal/Cedar-iOS.framework。不是带有 .a 扩展名的那个。

  2. 由于静态框架已经在没有 ARC 的情况下编译,因此我能够毫无问题地启用 ARC。

  3. 我在 info.plist 中也没有看到任何“主 nib 文件基本名称”键
  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
于 2012-05-10T07:25:03.800 回答