現在NSURLSession経由で非同期のdataTaskWithRequestにカスタムデリゲートを設定しようとしています。プロトコルを設定してデリゲートメソッドを実装しましたが、正しく実装したかどうか、単体テストを行う方法はわかりません。具体的には、呼び出された後にデリゲートが何かを返すかどうかをテストし、ライブAPI呼び出しでテストしたいと思います。私はここで提案されたアプローチ(OCUnit test for protocols/callbacks/delegate in Objective-C)でテストを試みましたが、テストが失敗しました。これは、おそらく何かが欠落しているか、非同期呼び出しを考慮していないためです。試行されたデリゲートの実装とユニットテストのコードは次のとおりです。NSURLSessionのデリゲートの設定とユニットテスト
委任プロトコル宣言:
#include "PtvApiPublic.h"
#ifndef PtvApiDelegate_h
#define PtvApiDelegate_h
@class PtvApi;
@protocol PtvApiDelegate <NSObject>
-(void) ptvApiHealthCheck: (PtvApi *) sender;
@end
#endif /* PtvApiDelegate_h */
ヘッダファイル:PtvApi.m
の#include "PtvApiDelegate.h"
#ifndef PtvApi_h
#define PtvApi_h
@interface PtvApi : NSObject
@property (nonatomic, weak) id <NSURLSessionDelegate> delegate;
- (void)ptvApiHealthCheck;
@end
#endif /* PtvApi_h */
スニペット
#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonHMAC.h>
#import <CommonCrypto/CommonDigest.h>
#import "PtvApiPublic.h"
#import "PtvApiPrivate.h"
#import "PtvApiDelegate.h"
@implementation PtvApi
@synthesize delegate;
...
- (void)ptvApiHealthCheck
{
NSString *fullUrl = [self GenerateRequestUrl];
NSURLSession *apiSession = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:delegate delegateQueue:nil];
NSURL *apiUrl = [NSURL URLWithString: fullUrl];
NSMutableURLRequest *urlRequest = [NSMutableURLRequest requestWithURL:apiUrl];
[apiSession dataTaskWithRequest:urlRequest];
}
@end
ユニットテスト:
#import <XCTest/XCTest.h>
#import "PtvApiPublic.h"
@interface APIDelegateTests : XCTestCase <NSURLSessionDelegate>
{
PtvApi *testApi;
BOOL callbackInvoked;
}
@end
@implementation APIDelegateTests
- (void)setUp {
[super setUp];
testApi = [[PtvApi alloc] init];
testApi.delegate = self;
}
- (void)tearDown {
testApi.delegate = nil;
[super tearDown];
}
- (void)testThatApiCallbackWorks {
[testApi ptvApiHealthCheck];
XCTAssert(callbackInvoked, @"Delegate should return something, I think...");
}
@end
私はNSURLSessionをテストする方法について(http://swiftandpainless.com/an-easy-way-to-stub-nsurlsession/)[ブログ記事を書いています]。たぶんこれが役立ちます。 – dasdom
@dasdomリンクをありがとう、私は私の他のスウィフトアプリをリエンジニアリングするときにそれを参照します。 –