2

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)!) {}
}

クラウド キット フレームワークは単体テストに最適な候補のようです。サーバーから返される可能性のあるエラーが多数あり、アプリがすべてのエラーを一貫して処理できることを確認し、すべての反復が優れているためです。誰かがこれを回避する方法を見つけましたか?

4

3 に答える 3

1

CKDatabase init が利用できないため、そのインスタンスを作成することはできません。そのため、そのインスタンスを作成することは決してできないため、MockDatabase を作成しても意味がありません。ある種のモッキングを行う唯一の方法は、CKDatabase 機能の周りに独自の DAO クラス ラッパーを作成し、その DAO を使用して CKDatabase 関数のみを呼び出すことです。次に、その DAO をモックできます。その DAO に機能を追加することもできますが、それをテストすることはできません。

于 2014-08-26T06:18:52.537 に答える
0

すべての CloudKit クラスは@objc(それらはすべて NSObject から派生します)。つまり、動的ディスパッチを使用します。Objective-C では、NSObject をサブクラス化し、CKDatabase のすべてのパブリック メソッド (または少なくとも使用するすべてのもの) を実装する新しい Obj-C クラス MockCKDatabase を実装することにより、CKDatabase をモックできます。MockCKDatabase*CKDatabase*

私は Swift でこの種のことをしたことがありませんが、同じ手順を実行しただけでうまくいくと思います。

于 2020-09-03T23:36:54.457 に答える