Specta
轻量级的 Objective-C 生存和行为驱动框架。
特性
- 类似 RSpec 的 Objective-C BDD DSL
- 快速轻松地设置
- 基于 XCTest 构建
- 卓越的 Xcode 集成
截图
示例
#import <Specta/Specta.h> // #import "Specta.h" if you're using libSpecta.a
SharedExamplesBegin(MySharedExamples)
// Global shared examples are shared across all spec files.
sharedExamplesFor(@"foo", ^(NSDictionary *data) {
__block id bar = nil;
beforeEach(^{
bar = data[@"bar"];
});
it(@"should not be nil", ^{
XCTAssertNotNil(bar);
});
});
SharedExamplesEnd
SpecBegin(Thing)
describe(@"Thing", ^{
sharedExamplesFor(@"another shared behavior", ^(NSDictionary *data) {
// Locally defined shared examples can override global shared examples within its scope.
});
beforeAll(^{
// This is run once and only once before all of the examples
// in this group and before any beforeEach blocks.
});
beforeEach(^{
// This is run before each example.
});
it(@"should do stuff", ^{
// This is an example block. Place your assertions here.
});
it(@"should do some stuff asynchronously", ^{
waitUntil(^(DoneCallback done) {
// Async example blocks need to invoke done() callback.
done();
});
});
itShouldBehaveLike(@"a shared behavior", @{@"key" : @"obj"});
itShouldBehaveLike(@"another shared behavior", ^{
// Use a block that returns a dictionary if you need the context to be evaluated lazily,
// e.g. to use an object prepared in a beforeEach block.
return @{@"key" : @"obj"};
});
describe(@"Nested examples", ^{
it(@"should do even more stuff", ^{
// ...
});
});
pending(@"pending example");
pending(@"another pending example", ^{
// ...
});
afterEach(^{
// This is run after each example.
});
afterAll(^{
// This is run once and only once after all of the examples
// in this group and after any afterEach blocks.
});
});
SpecEnd
beforeEach
和afterEach
也分别称为before
和after
。describe
也称为context
。it
也称为example
和specify
。itShouldBehaveLike
也可称为itBehavesLike
。- 使用
pending
或在describe
、context
、example
、it
和specify
前面加x
来标记示例或组为待定。 - 使用示例中所示
使示例等待完成。需要调用 done()
回调函数来让 Specta 知道测试已完成。默认超时时间为 10.0 秒,但可以通过调用函数setAsyncSpecTimeout(NSTimeInterval timeout)
来更改此时间。 (before|after)(Each|All)
也可以接受。 - 如果喜欢使用
SPEC_BEGIN
和SPEC_END
而不是SpecBegin
和SpecEnd
语法,请在导入 Specta 之前执行#define SPT_CEDAR_SYNTAX
。 - 在
describe
、context
、example
、it
和specify
前面加f
来关注示例或组。当规格被关注时,所有未关注的规格将被跳过。 - 要在测试方案中将
SPECTA_REPORTER_CLASS
环境变量设置为SPTXCTestReporter
以使用原始 XCTest 报告器。 - 设置环境变量
SPECTA_SHUFFLE
的值为1
以启用测试混洗(shuffle)。 - 通过设置环境变量
SPECTA_SEED
指定测试混洗的随机种子。
标准的 XCTest 匹配器,如 XCTAssertEqualObjects
和 XCTAssertNil
都是有效的,但你可能还希望添加一个更友好的匹配器框架 - 在你的设置中添加 Expecta。或者,如果你真的喜欢,OCHamcrest 也是很好用的。另外,添加一个模拟框架: OCMock。
状态
Specta 是一个完成的项目,目前没有计划对该项目进行 活跃 的开发,除了确保未来的 Xcode 兼容性。因此,它是一个稳定的依赖项,但是不会迁移到 Swift 世界。如果你正在寻找这样的东西,我们推荐你考虑 Quick。
在命令行中运行 Specta 的测试
- 在克隆的文件夹中运行
rake test
。
贡献指南
- 请只使用空格,每次缩进两个空格。
- 请在实例变量名称前添加单个下划线(
_
)。 - 请在全球范围内定义的定制类和函数前加上
SPT
。
安装
CocoaPods
- 在项目的
Podfile
中添加 Specta。
target :MyApp do
# your app dependencies
target :MyAppTests do
inherit! :search_paths
pod 'Specta', '~> 2.0'
# pod 'Expecta', '~> 1.0' # expecta matchers
# pod 'OCMock', '~> 2.2' # OCMock
# pod 'OCHamcrest', '~> 3.0' # hamcrest matchers
# pod 'OCMockito', '~> 1.0' # OCMock
# pod 'LRMocky', '~> 0.9' # LRMocky
end
end
- 在项目目录中运行
pod install
。
Carthage
-
将 Specta 添加到项目的
Cartfile.private
中。github "specta/specta" ~> 2.0
-
在项目目录中运行
carthage update
。 -
将适当的
Specta.framework
(位于 Carthage/Build/ 目录下) 拖入您的应用 Xcode 项目中,并将其添加到测试目标中。 -
如果您正在为 iOS 构建项目,必须向 Xcode 项目中添加一个新的
Run Script Phase
来复制框架。具体说明可参见 Carthage 入门指南
手动设置
- 从 GitHub 上克隆。
- 在项目根目录中运行
rake
以进行构建。 - 如果您还没有,请添加一个 "Cocoa/Cocoa Touch 单元测试 Bundle" 目标。
- 将
Products
目录下的所有头文件复制并添加到 Xcode 项目中的测试目标中。 - 对于 OS X 项目,将
Products/osx
目录下的Specta.framework
复制并添加到 Xcode 项目中的测试目标中。对于 iOS 项目,将Products/ios
目录下的Specta.framework
复制并添加到 Xcode 项目中的测试目标中。如果您愿意将 Specta 作为静态库添加到项目中,可以使用libSpecta.a
。(iOS 7 及以下版本需要这样做) - 将 "Other Linker Flags" 构建设置中的
-ObjC
和-all_load
添加到 Xcode 项目中测试目标的构建设置。 - 如果您遇到与
_llvm_*
符号的链接问题,请确保您的目标 "Generate Test Coverage Files" 和 "Instrument Program Flow" 构建设置设置为Yes
。