使用Kiwi测试iOS的Mock子类

时间:2011-10-21 04:35:25

标签: iphone ios unit-testing bdd kiwi

我有一个应用程序,我使用Objective Resource创建本地对象以反映远程响应。

特定的模型类具有一个abstract-ish类的子类,为它们提供了各种附加功能,最重要的是能够序列化,写入磁盘和从磁盘加载,无论具体属性是什么特定的模型对象。

superclass.m

-(BOOL)saveToDisk{  
    ...serializes and encodes all properties to disk  
    ...return success
}


subclass.h : superclass

@property (nonatomic, retain) NSString* name;
@property (nonatomic, retain) NSArray* friends;
 ...etc

然后我会打电话给

     instanceOfSubclass.name = "joe"  
     NSLog(@"save status = %d",[instanceOfSubclass saveToDisk]);

我是BDD的新手,通常是测试驱动的开发。如何使用kiwi创建一个模拟对象来抽象地测试这个功能,因为我在很多项目中使用这个框架。

具体来说,我想构建测试,以确保可以保存加载,删除和覆盖具有各种类型属性的子类。

我的理解是,这是存根和模拟进入的地方,但我似乎无法弄清楚如何模拟属性。我是否必须创建具有这些属性的实际类?

2 个答案:

答案 0 :(得分:1)

属性是幕后的方法,所以:

我设法使用+mock提到的@aopsfan方法的组合,然后使用-stub:andReturn:我猜测了实现属性的方法的名称。此示例有效,冒充TCConnection(来自Twilio iOS SDK):

// Instantiates a mocked object:
id fake_connection = [TCConnection mock];
// Creates a faked property accessor:
[fake_connection stub:@selector(parameters)
            andReturn:@{@"From": @"fake-caller"}];

// I could now call my TCDeviceDelegate 's
// -device:didReceiveIncomingConnection:
[myActualObject device:myActualObject.device
            didReceiveIncomingConnection:fake_connection];
// Check some results on the object:
[[myActualObject.connection should] equal:fake_connection];

这种模式特定的例子可能会推广到其他情况。调用-stub(没有andReturn:)参数来静音无法在模拟夹具中调用的方法很有用。

答案 1 :(得分:0)

this location为您提供了一些文档。基本上,Kiwi在NSObject上提供了您#import "Kiwi.h"时可以访问的Objective-C类别。这允许从NSObject继承的所有对象都响应+mockmockWithName:等,这可以通过KWMock类进行配置。

希望这会有所帮助,对不起有点迟了:)