問題
多くの単体テストでは、モック オブジェクトに OCMock を使用しています。コードがサーバーの応答にどのように応答するかを確認するテストの一環として、NSURLSessionDataTask オブジェクトを作成し、後で「応答」プロパティを使用してみます。
プロットが厚くなる
iOS 9 より前では、テストは問題なく実行されていました。このプロパティは、iOS 9 のアプリの通常のコールバック フローでも正しく機能します。
ただし、iOS 9 ベータ版では、実行時に「認識されないセレクターがインスタンスに送信されました」というエラーでテストがクラッシュします。このプロパティはフレームワーク ヘッダーに存在し、ドキュメントでは削除済みとしてマークされていません。
このサンプル コードは、問題を示しています。
NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
NSLog(@"%@", task.response);
理論
クラスの直接のインスタンス化は、実行時にプロパティを提供しなくなったようです。プロパティは、@dynamic
インスタンス化の別のパスを使用して実行時に生成されるプロパティのようです。
質問
iOS 8 での単体テストの実行と下位互換性がある方法で、OCMock オブジェクトの単体テストでこの問題を回避するにはどうすればよいですか?
更新 1
OCMock を最新 (3.1.5) に更新しても問題は解決しません。
追加のコンテキストとして、NSURLSessionDataTask
OCMock を使用する方法を次に示します。テストは 3 行目で失敗します。
NSURLSessionDataTask *task = [[NSURLSessionDataTask alloc] init];
OCMockObject *mockTask = [OCMockObject partialMockForObject:task];
[[[mockTask stub] andReturn:urlResponse] response];