为单元测试创​​建模拟云工具包对象

时间:2014-08-25 17:27:54

标签: unit-testing swift cloudkit

尝试模拟CKDatabase,但它没有可访问的初始化程序。还有另一种创建假CKDatabase对象的方法吗?

此代码返回“错误:无法覆盖'init'已被标记为不可用”

class MockDatabase : CKDatabase
{
    override func saveRecord(record: CKRecord!, completionHandler: ((CKRecord!, NSError!) -> Void)!) { }

    override func deleteRecordWithID(recordID: CKRecordID!, completionHandler: ((CKRecordID!, NSError!) -> Void)!) { }

    override func fetchRecordWithID(recordID: CKRecordID!, completionHandler: ((CKRecord!, NSError!) -> Void)!) { }

    override func deleteSubscriptionWithID(subscriptionID: String!, completionHandler: ((String!, NSError!) -> Void)!) { }

    override func saveSubscription(subscription: CKSubscription!, completionHandler: ((CKSubscription!, NSError!) -> Void)!) {}
}

云套件框架似乎是单元测试的理想选择,因为有很多可能的错误可以从服务器返回并确保您的应用程序可以一致地处理它们,每次迭代都会很棒。有没有人找到解决方法?

2 个答案:

答案 0 :(得分:1)

由于CKDatabase init不可用,您将永远无法创建它的实例。因此,创建MockDatabase没有意义,因为您永远无法创建该实例。进行某种Mocking的唯一方法是围绕CKDatabase功能创建自己的DAO类包装器,并仅使用该DAO调用CKDatabase函数。然后你可以嘲笑那个DAO。您甚至可以为该DAO添加额外的功能,但之后您将无法对其进行测试。

答案 1 :(得分:0)

所有CloudKit类都是@objc(它们都源自NSObject。)这意味着它们使用动态调度。在Objective-C中,您可以通过实现一个新的Obj-C类MockCKDatabase来模拟CKDatabase,该类继承NSObject并实现CKDatabase的所有公共方法(或至少使用的所有方法)。然后,您只需实例化一个实例并从中强制转换指针即可。 MockCKDatabase*CKDatabase*

我从来没有在Swift中做过这样的事情,但是我想如果您执行相同的步骤,它应该可以工作。