2016-03-09 10 views
5

アップルのCoreBluetoothフレームワークを使用してBluetooth Low Energyを介して周辺機器と通信するSwiftでiOSアプリケーションを構築しています。 CBCentralManagerDelegateCBPeripheralDelegateプロトコルを実装するカスタムコントローラのテストユニットの努力で、私は二重のCoreBluetoothのAPIの動作を模倣するCBCentralManagerからサブクラステストを提供しています。コントローラーのデリゲートコールバックは、適切な時刻に呼び出されます。ユニットテストで使用できない初期化子を使用したCocoaオブジェクトを偽装する

これまでのところ、これはかなりうまく機能しています。それはCBPeripheralDelegateコールバックを呼び出すに来るときしかし、CBPeripheralが渡される必要がある。通常、私はちょうど偽のコンポーネントが自分自身のサブクラスを提供するかCBPeripheralのインスタンスをモックでしょう。

はここでキャッチです:基礎となるのObjective-Cライブラリでの指定イニシャライザCBPeripheralが私の偽造CBCentralManagerCBPeripheralをインスタンス化し、引数として渡すから私を防止する使用不能としてマークされています試験中のCBPeripheralDelegate。 (XCodeはコンパイラエラーで私を残します)。これまで、偽のサブクラス(私は使用できない指定されたinitを呼び出さなければならないため動作しません)でカスタムイニシャライザを提供しようとしました。エクステンション(明らかに許可されていません)を使用し、Objective-Cランタイムでセレクタ(init)を呼び出すと、使用できないということはありません。最後のアプローチは最も有望なようですが、実際には動作していないので、間違ったタイプの管理されていないオブジェクト(私のテストクラス)を私に残します。

私は間違いなくここにバリケードを打ってきましたし、initにもかかわらずCBPeripheralをインスタンス化

  1. 上の任意の入力のために非常に喜んでいるだろう()使用できない

  2. 異なるアプローチであること単位試験のためにCBPeripheralDelegate

答えて

2

私はObjective-Cでオブジェクト・ファクトリを作成し、オブジェクト・ファクトリをオブジェクト・ファクトリで作成し、そのポインタを使用して初期化子の実装を呼び出し、使用不可能なマークを無視することで、問題を解決しました。詳細については

参照: http://ijoshsmith.com/2014/06/05/instantiating-classes-by-name-in-swift/ (これは現在のスウィフトにはもう機能していないが、容​​易に適合させることができる)

関連する問題