测试已测试 | ✓ |
Lang语言 | Obj-CObjective C |
许可证 | 自定义 |
发布最新发布 | 2015年6月 |
由 Csaba Szabo,Peter Adam Wiesner,ZsomborFuszenecker 维护。
Dixie是一个开源Objective-C测试框架,用于修改对象行为。通过在内部系统中引起混乱来测试您的应用程序。Dixie的主要目标是提供一套工具,让开发者可以使用它们来测试他们的代码。背后的理念是"不总是期望最好的+"。您可以在这里了解更多关于这一点。
首先定义应在哪个类的方法上应用更改,以及其新行为。您可以通过创建一个DixieProfileEntry
来完成此操作
//Tomorrow
NSDate* testDate = [NSDate dateWithTimeIntervalSinceNow:24*60*60];
//A behaviour to always return tomorrow's date
DixieChaosProvider* provider = [DixieConstantChaosProvider constant:testDate];
//Create the entry
DixieProfileEntry* entry = [DixieProfileEntry entry:[NSDate class] selector:@selector(date) chaosProvider:provider]
然后创建一个Dixie
配置实例,设置配置文件并应用。
//Create Dixie configuration
Dixie* dixie = [Dixie new];
//Set and apply change
dixie
.Profile(entry)
.Apply();
在应用配置文件之后,每次调用[NSDate date]
都将返回明天的日期而不是今天的日期。这样您可以在不更改设备设置的情况下测试日期问题。
当您不再需要Dixie时,撤销更改
//Revert the change of the entry
dixie
.RevertIt(entry);
完整代码
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSDate* testDate = [NSDate dateWithTimeIntervalSinceNow:24*60*60];
DixieChaosProvider* provider = [DixieConstantChaosProvider constant:testDate];
DixieProfileEntry* entry = [DixieProfileEntry entry:[NSDate class] selector:@selector(date) chaosProvider:provider]
Dixie* dixie = [Dixie new];
dixie
.Profile(entry)
.Apply();
return YES;
}
您可以设置多个配置文件并一次撤销它们所有。您还可以选择预设行为
提供原始行为。当您只想在特殊情况下使用不同的行为时,这是一个不错的选择。
提供始终返回一个常量对象的行为。
提供始终返回 nil
的行为。
提供由块描述的行为。使用此提供程序可以将方法替换为完全自定义的行为。为了访问方法参数和设置返回值,您可以使用传递给块的DixieCallEnvironment
对象。
提供返回随机对象的行为。默认实现返回一个随机的 NSNumber
。
提供抛出异常的行为。
对于每次调用,它返回第ith个混沌提供者的行为,其中i
是调用次数。如果调用次数超过了预定义的混沌提供者数量,将使用最后一个提供者的行为。
检查方法的参数,如果其中一个与给定的DixieCompositeCondition
的值匹配,则返回连接的混沌提供者的行为。
改变对象行为的思想并不新鲜,它被称为模拟。这通常用于单元测试,其中组件的依赖关系被模拟以创建一个可控、可重复的环境。在这些情况下,目标项目应当是易于注入的。如果你依赖于不是由你编制的,或者不可注入的组件,你必须转向其他方法。为了在Objective-C环境中实现创建混沌/改变组件行为的理论,Dixie使用了方法交换的技术。方法交换依赖于调用特殊的运行时方法,这需要了解目标方法和其环境。Dixie会为你处理运行时,同时隐藏原始方法环境,这样你只需关注定义新的行为并可以快速简单地应用。
注意
void
要么是对象的方法的行为。对基本类型的支持将在下一个版本中提供。您可以在仓库中找到一个Dixie示例应用项目,其中包含一些如何使用Dixie的常见用例。该项目需要CocoaPods依赖管理器,因此您必须在DixieExampleApp
目录中运行pod install
命令才能运行该项目。
该示例应用涵盖三个用例
使用CLLocationManager
显示地图上的实际位置。Dixie更改了locationManager:didUpdateLocations:
方法的实现,因此任何位置都可以轻松模拟。示例应用模拟了一个随机城市。使用Dixie Revert函数则使用设备位置。整个逻辑可以在MapViewController.m
中找到。它使用DixieBlockChaosProvider
以便能够用块改变方法实现。
到下一次哈雷彗星到达的倒计时计时器。倒计时计时器使用实际的日期函数([NSDate date]
),而Dixie更改了该方法的实现并模拟了自实际日期起-10000天至+10000天之间的随机日期。整个逻辑可以在CountDownViewController.m
中找到。它使用DixieConstantChaosProvider
,后者提供固定值模拟。
此示例展示了使用OpenWeatherMap API作为数据源以及AFNetworking框架来显示当前位置的天气。AFNetworking是一个流行的iOS和OS X网络框架。Dixie更改了AFNetworking框架中AFHTTPRequestOperationManager
类的GET:parameters:success:failure:
方法实现。请求不会发送到网络,Dixie创建响应对象并调用success
回调,这是一个由成功的网络响应产生的异步回调。整个逻辑可以在WeatherViewController.m
中找到,它使用一个DixieBlockChaosProvider
。
Dixie的诞生源于Peter Adam Wiesner的一个想法。原型由Phillip Wheatley、Tamas Flamich、Zsolt Varnai和Peter Adam Wiesner在一周内通过一个研究实验室项目实现。这个原型由Zsolt Varnai、Csaba Szabo、Zsombor Fuszenecker和Peter Adam Wiesner开发成为一个开源库。
如果您有任何提高Dixie的方法,请贡献一下吧!
您可以通过以下方式联系我们