如何设置 cedar 以对 ios 应用程序进行 bdd 测试?
Posted
技术标签:
【中文标题】如何设置 cedar 以对 ios 应用程序进行 bdd 测试?【英文标题】:how do I setup cedar for bdd testing of ios apps? 【发布时间】:2012-05-03 23:36:25 【问题描述】:我正在尝试设置 cedar,但无法使其正常工作。我正在尝试按照 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 中:file://localhost/Users/nelsond/workspace/BIM360UIArchitecture/BIM360UIPrototype/BIM360Issues-IOS/BIM360Issues-IOS-Specs-ARC/main.m:错误:词法或预处理器问题:'未找到 Cedar-iOS/Cedar-iOS.h' 文件 2)在TestSpec.m中:文件://localhost/Users/nelsond/workspace/BIM360UIArchitecture/BIM360UIPrototype/BIM360Issues-IOS/BIM360Issues-IOS-Specs-ARC/TestSpec.m:错误:词法或预处理器问题:'Cedar/SpecHelper .h' 文件未找到
我很困惑接下来要调试什么。
【问题讨论】:
什么是“雪松”?只有 40 个贴有“雪松”标签的帖子,其中大部分是关于云平台 Heroku。您的帖子与 Heroku 无关。 “Cedar 是一个 BDD 风格的 Objective-C 测试框架。”来源:github.com/pivotal/cedar 【参考方案1】:a) 您可以将 ARC 用于您的主要应用目标。
b) 不确定您为什么要问这个问题,Cedar 本身不应该使用 ARC 构建。反正就用默认配置就好了,不用乱搞。
c) 您不应该在测试类中使用 ARC。
d) 如果你创建一个新项目,你可以使用默认的自动生成的 OCUnit 目标。
几个月以来,我一直在使用 Cedar 和我的 iOS 应用程序,我真的很喜欢它。
我将它与 OCUnit 一起使用,因此我只需点击 Cmd+U
即可运行我的测试,并且我有一个特定的方案可以从我的 CI 服务器运行它们。
我更喜欢创建git submodule
来获取 Cedar 的代码,而无需编辑其文件。您可以简单地将 Cedar 的 Xcode 项目拖到应用程序的工作区中。最好使用静态库。如您所述,添加链接器标志。您还需要告诉 Xcode 在哪里可以找到头文件(User Header Search Paths
,类似于 "$(PROJECT_DIR)/Libraries/cedar/Source/Headers"
)。现在你应该准备好了。
我为我的测试课程禁用了 ARC(请参阅 How can I disable ARC for a single file in a project?)。请注意,ARC 配置实际上是特定于文件的,因此您可以将主要目标(使用 ARC)中的文件包含到测试文件中,它们会很好地混合。有时有点混乱,但非常强大。
希望这能有所帮助。
【讨论】:
【参考方案2】:以下是我在 iOS 应用程序中集成 Cedar 时遇到的一些问题。
“Cedar-iOS 静态框架”似乎是指以下文件夹:~/Library/Developer/Xcode/DerivedData/Cedar-borwneaogydgaodbtmfyaccykqxn/Build/Products/Debug-iphoneuniversal/Cedar-iOS.framework 。不是带有 .a 扩展名的那个。
我能够毫无问题地启用 ARC,因为静态框架已经在没有 ARC 的情况下编译。
我在 info.plist 中也没有看到任何“主 nib 文件基本名称”键 第一段代码是我用于测试目标的 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
【讨论】:
以上是关于如何设置 cedar 以对 ios 应用程序进行 bdd 测试?的主要内容,如果未能解决你的问题,请参考以下文章
如何将heroku cedar-14堆栈应用程序升级到最新的heroku堆栈(即,升级到heroku 18)
如何在 Reactive Extensions 中组合两个 observables 以对结果进行分页?