Ich versuche derzeit, einen benutzerdefinierten Delegaten für eine asynchrone dataTaskWithRequest über NSURLSession einzurichten. Ich habe das Protokoll eingerichtet und die Delegate-Methode implementiert, aber ich muss herausfinden, ob ich es richtig implementiert habe und wie ich es testen kann. Insbesondere möchte ich testen, ob der Delegat nach dem Aufruf etwas zurückgibt und mit einem Live-API-Aufruf testet. Ich habe versucht, über den hier vorgeschlagenen Ansatz zu testen (OCUnit test for protocols/callbacks/delegate in Objective-C), aber der Test schlägt fehl, wahrscheinlich, weil ich etwas vermisse oder den Async-Aufruf nicht berücksichtige. Der Code für die versuchte Delegiertenimplementierung und der Komponententest sind unten aufgeführt.Delegat für NSURLSession einrichten und Einheit testen
Delegierter Protokollerklärung:
#include "PtvApiPublic.h"
#ifndef PtvApiDelegate_h
#define PtvApiDelegate_h
@class PtvApi;
@protocol PtvApiDelegate <NSObject>
-(void) ptvApiHealthCheck: (PtvApi *) sender;
@end
#endif /* PtvApiDelegate_h */
Headerdatei:
#include "PtvApiDelegate.h"
#ifndef PtvApi_h
#define PtvApi_h
@interface PtvApi : NSObject
@property (nonatomic, weak) id <NSURLSessionDelegate> delegate;
- (void)ptvApiHealthCheck;
@end
#endif /* PtvApi_h */
Snippet PtvApi.m
#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
Unit-Test:
#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
I [schrieb einen Blog-Post] (http://swiftandpainless.com/an-easy-way-to-stub-nsurlsession/) darüber, wie ich NSURLSession testen. Vielleicht hilft das. – dasdom
@dasdom Danke für den Link, ich werde darauf verweisen, wenn ich meine andere Swift App neu überarbeite. –