【问题标题】:iOS Testing Mock Subclass With Properties Using KiwiiOS 使用 Kiwi 测试具有属性的 Mock 子类
【发布时间】:2011-10-21 04:35:24
【问题描述】:

我有一个应用程序,为此我使用目标资源创建本地对象以反映远程响应。

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

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 创建一个模拟对象来抽象地测试这个功能,因为我在很多项目中都使用了这个框架。

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

我的理解是,这就是存根和模拟的用武之地,但我似乎无法弄清楚如何模拟属性。我必须用这些属性创建一个实际的类吗?

【问题讨论】:

    标签: iphone ios unit-testing bdd kiwi


    【解决方案1】:

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

    我设法通过结合@aopsfan 提到的+mock 方法来做到这一点,然后使用-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:)参数来使无法在模拟夹具中调用的方法静音很有用。

    【讨论】:

      【解决方案2】:

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

      希望这会有所帮助,抱歉有点晚了:)

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      相关资源
      最近更新 更多